From 867dc3136eb0d3c92812519cec8ec2a66231d088 Mon Sep 17 00:00:00 2001 From: Blankj Date: Thu, 18 Jun 2020 11:39:06 +0800 Subject: [PATCH 1/6] add 1014 --- README.md | 2 + note/1014/README.md | 60 +++++++++++++++++++++++ src/com/blankj/medium/_1014/Solution.java | 27 ++++++++++ 3 files changed, 89 insertions(+) create mode 100644 note/1014/README.md create mode 100644 src/com/blankj/medium/_1014/Solution.java diff --git a/README.md b/README.md index 1920efdd..83306127 100644 --- a/README.md +++ b/README.md @@ -88,6 +88,7 @@ | 50 | [Pow(x, n)][050] | Math, Binary Search | | 56 | [Merge Intervals][056] | Array, Sort | | 554 | [Brick Wall][554] | Hash Table | +| 1014 | [最佳观光组合][1014] | 数组 | ## Hard @@ -170,6 +171,7 @@ [050]: https://github.com/Blankj/awesome-java-leetcode/blob/master/note/050/README.md [056]: https://github.com/Blankj/awesome-java-leetcode/blob/master/note/056/README.md [554]: https://github.com/Blankj/awesome-java-leetcode/blob/master/note/554/README.md +[1014]: https://github.com/Blankj/awesome-java-leetcode/blob/master/note/1014/README.md [004]: https://github.com/Blankj/awesome-java-leetcode/blob/master/note/004/README.md [010]: https://github.com/Blankj/awesome-java-leetcode/blob/master/note/010/README.md diff --git a/note/1014/README.md b/note/1014/README.md new file mode 100644 index 00000000..61a05d0a --- /dev/null +++ b/note/1014/README.md @@ -0,0 +1,60 @@ +# [最佳观光组合][title] + +## 题目描述 + +给定正整数数组 `A`,`A[i]` 表示第 `i` 个观光景点的评分,并且两个景点 `i` 和 `j` 之间的距离为 `j - i`。 + +一对景点(`i < j`)组成的观光组合的得分为(`A[i] + A[j] + i - j`):景点的评分之和**减去**它们两者之间的距离。 + +返回一对观光景点能取得的最高分。 + +**示例:** + +``` +输入:[8,1,5,2,6] +输出:11 +解释:i = 0, j = 2, A[i] + A[j] + i - j = 8 + 5 + 0 - 2 = 11 +``` + +**提示:** + +1. `2 <= A.length <= 50000` +2. `1 <= A[i] <= 1000` + +**标签:** 数组 + + +## 思路 + +直接暴力两层 for 循环肯定过不了关,我们把公式变化为 `(A[i] + i) + (A[j] - j)`,看到此应该就可以想到在每次遍历 `j` 时,只需要知道 `max(A[i] + i)` 即可。 + +```java +class Solution { + + public int maxScoreSightseeingPair(int[] A) { + int ans = 0, cur = A[0] + 0; + for (int j = 1; j < A.length; j++) { + ans = Math.max(ans, cur + A[j] - j); // 计算当前最大得分 + cur = Math.max(cur, A[j] + j); // 更新最大的 A[i] + i + } + return ans; + } + + public static void main(String[] args) { + Solution solution = new Solution(); + int[] A = new int[]{8, 1, 5, 2, 6}; + System.out.println(solution.maxScoreSightseeingPair(A)); + } +} + +``` + + +## 结语 + +如果你同我一样热爱数据结构、算法、LeetCode,可以关注我 GitHub 上的 LeetCode 题解:[awesome-java-leetcode][ajl] + + + +[title]: https://leetcode-cn.com/problems/best-sightseeing-pair/ +[ajl]: https://github.com/Blankj/awesome-java-leetcode diff --git a/src/com/blankj/medium/_1014/Solution.java b/src/com/blankj/medium/_1014/Solution.java new file mode 100644 index 00000000..fa0ece30 --- /dev/null +++ b/src/com/blankj/medium/_1014/Solution.java @@ -0,0 +1,27 @@ +package com.blankj.medium._1014; + +/** + *
+ *     author: Blankj
+ *     blog  : http://blankj.com
+ *     time  : 2020/06/18
+ *     desc  :
+ * 
+ */ +public class Solution { + + public int maxScoreSightseeingPair(int[] A) { + int ans = 0, cur = A[0] + 0; + for (int j = 1; j < A.length; j++) { + ans = Math.max(ans, cur + A[j] - j); // 计算当前最大得分 + cur = Math.max(cur, A[j] + j); // 更新最大的 A[i] + i + } + return ans; + } + + public static void main(String[] args) { + Solution solution = new Solution(); + int[] A = new int[]{8, 1, 5, 2, 6}; + System.out.println(solution.maxScoreSightseeingPair(A)); + } +} From dbe51e8172d48df200076af2ff003f2a8a04f366 Mon Sep 17 00:00:00 2001 From: Blankj Date: Mon, 29 Jun 2020 21:24:51 +0800 Subject: [PATCH 2/6] add 1028 --- README.md | 273 +++++++++--------- note/{001 => 0001}/README.md | 0 note/{002 => 0002}/README.md | 0 note/{003 => 0003}/README.md | 0 note/{004 => 0004}/README.md | 0 note/{004 => 0004}/my_draw.jpg | Bin note/{005 => 0005}/README.md | 0 note/{006 => 0006}/README.md | 0 note/{007 => 0007}/README.md | 0 note/{008 => 0008}/README.md | 0 note/{009 => 0009}/README.md | 0 note/{010 => 0010}/README.md | 0 note/{011 => 0011}/README.md | 0 note/{011 => 0011}/water.png | Bin note/{012 => 0012}/README.md | 0 note/{013 => 0013}/README.md | 0 note/{014 => 0014}/README.md | 0 note/{015 => 0015}/README.md | 0 note/{016 => 0016}/README.md | 0 note/{017 => 0017}/README.md | 0 note/{018 => 0018}/README.md | 0 note/{019 => 0019}/README.md | 0 note/{020 => 0020}/README.md | 0 note/{021 => 0021}/README.md | 0 note/{022 => 0022}/README.md | 0 note/{023 => 0023}/README.md | 0 note/{024 => 0024}/README.md | 0 note/{025 => 0025}/README.md | 0 note/{026 => 0026}/README.md | 0 note/{027 => 0027}/README.md | 0 note/{028 => 0028}/README.md | 0 note/{029 => 0029}/README.md | 0 note/{030 => 0030}/README.md | 0 note/{031 => 0031}/README.md | 0 note/{033 => 0033}/README.md | 0 note/{035 => 0035}/README.md | 0 note/{038 => 0038}/README.md | 0 note/{043 => 0043}/README.md | 0 note/{044 => 0044}/README.md | 0 note/{049 => 0049}/README.md | 0 note/{050 => 0050}/README.md | 0 note/{053 => 0053}/README.md | 0 note/{056 => 0056}/README.md | 0 note/{057 => 0057}/README.md | 0 note/{058 => 0058}/README.md | 0 note/{066 => 0066}/README.md | 0 note/{067 => 0067}/README.md | 0 note/{068 => 0068}/README.md | 0 note/{069 => 0069}/README.md | 0 note/{070 => 0070}/README.md | 0 note/{083 => 0083}/README.md | 0 note/{088 => 0088}/README.md | 0 note/{100 => 0100}/README.md | 0 note/{101 => 0101}/README.md | 0 note/{104 => 0104}/README.md | 0 note/{107 => 0107}/README.md | 0 note/{108 => 0108}/README.md | 0 note/{110 => 0110}/README.md | 0 note/{111 => 0111}/README.md | 0 note/{112 => 0112}/README.md | 0 note/{118 => 0118}/README.md | 0 note/{119 => 0119}/README.md | 0 note/{121 => 0121}/README.md | 0 note/{122 => 0122}/README.md | 0 note/0209/README.md | 81 ++++++ note/{543 => 0543}/README.md | 0 note/{554 => 0554}/README.md | 0 note/1014/README.md | 4 +- note/1028/README.md | 148 ++++++++++ .../blankj/easy/{_001 => _0001}/Solution.java | 0 .../blankj/easy/{_007 => _0007}/Solution.java | 0 .../blankj/easy/{_009 => _0009}/Solution.java | 0 .../blankj/easy/{_013 => _0013}/Solution.java | 0 .../blankj/easy/{_014 => _0014}/Solution.java | 0 .../blankj/easy/{_020 => _0020}/Solution.java | 0 .../blankj/easy/{_021 => _0021}/Solution.java | 0 .../blankj/easy/{_026 => _0026}/Solution.java | 0 .../blankj/easy/{_027 => _0027}/Solution.java | 0 .../blankj/easy/{_028 => _0028}/Solution.java | 0 .../blankj/easy/{_035 => _0035}/Solution.java | 0 .../blankj/easy/{_038 => _0038}/Solution.java | 0 .../blankj/easy/{_053 => _0053}/Solution.java | 0 .../blankj/easy/{_058 => _0058}/Solution.java | 0 .../blankj/easy/{_066 => _0066}/Solution.java | 0 .../blankj/easy/{_067 => _0067}/Solution.java | 0 .../blankj/easy/{_069 => _0069}/Solution.java | 0 .../blankj/easy/{_070 => _0070}/Solution.java | 0 .../blankj/easy/{_083 => _0083}/Solution.java | 0 .../blankj/easy/{_088 => _0088}/Solution.java | 0 .../blankj/easy/{_100 => _0100}/Solution.java | 0 .../blankj/easy/{_101 => _0101}/Solution.java | 0 .../blankj/easy/{_104 => _0104}/Solution.java | 0 .../blankj/easy/{_107 => _0107}/Solution.java | 0 .../blankj/easy/{_108 => _0108}/Solution.java | 0 .../blankj/easy/{_110 => _0110}/Solution.java | 0 .../blankj/easy/{_111 => _0111}/Solution.java | 0 .../blankj/easy/{_112 => _0112}/Solution.java | 0 .../blankj/easy/{_118 => _0118}/Solution.java | 0 .../blankj/easy/{_119 => _0119}/Solution.java | 0 .../blankj/easy/{_121 => _0121}/Solution.java | 0 .../blankj/easy/{_122 => _0122}/Solution.java | 0 .../blankj/easy/{_543 => _0543}/Solution.java | 0 .../blankj/hard/{_004 => _0004}/Solution.java | 0 .../blankj/hard/{_010 => _0010}/Solution.java | 0 .../blankj/hard/{_023 => _0023}/Solution.java | 0 .../blankj/hard/{_025 => _0025}/Solution.java | 0 .../blankj/hard/{_030 => _0030}/Solution.java | 0 .../blankj/hard/{_044 => _0044}/Solution.java | 0 .../blankj/hard/{_068 => _0068}/Solution.java | 0 src/com/blankj/hard/_1028/Solution.java | 80 +++++ .../medium/{_002 => _0002}/Solution.java | 0 .../medium/{_003 => _0003}/Solution.java | 0 .../medium/{_005 => _0005}/Solution.java | 0 .../medium/{_006 => _0006}/Solution.java | 0 .../medium/{_008 => _0008}/Solution.java | 0 .../medium/{_011 => _0011}/Solution.java | 0 .../medium/{_012 => _0012}/Solution.java | 0 .../medium/{_015 => _0015}/Solution.java | 0 .../medium/{_016 => _0016}/Solution.java | 0 .../medium/{_017 => _0017}/Solution.java | 0 .../medium/{_018 => _0018}/Solution.java | 0 .../medium/{_019 => _0019}/Solution.java | 0 .../medium/{_022 => _0022}/Solution.java | 0 .../medium/{_024 => _0024}/Solution.java | 0 .../medium/{_029 => _0029}/Solution.java | 0 .../medium/{_033 => _0033}/Solution.java | 0 .../medium/{_043 => _0043}/Solution.java | 0 .../medium/{_049 => _0049}/Solution.java | 0 .../medium/{_050 => _0050}/Solution.java | 0 .../medium/{_056 => _0056}/Solution.java | 0 .../medium/{_057 => _0057}/Solution.java | 0 .../medium/{_554 => _0554}/Solution.java | 0 132 files changed, 447 insertions(+), 139 deletions(-) rename note/{001 => 0001}/README.md (100%) rename note/{002 => 0002}/README.md (100%) rename note/{003 => 0003}/README.md (100%) rename note/{004 => 0004}/README.md (100%) rename note/{004 => 0004}/my_draw.jpg (100%) rename note/{005 => 0005}/README.md (100%) rename note/{006 => 0006}/README.md (100%) rename note/{007 => 0007}/README.md (100%) rename note/{008 => 0008}/README.md (100%) rename note/{009 => 0009}/README.md (100%) rename note/{010 => 0010}/README.md (100%) rename note/{011 => 0011}/README.md (100%) rename note/{011 => 0011}/water.png (100%) rename note/{012 => 0012}/README.md (100%) rename note/{013 => 0013}/README.md (100%) rename note/{014 => 0014}/README.md (100%) rename note/{015 => 0015}/README.md (100%) rename note/{016 => 0016}/README.md (100%) rename note/{017 => 0017}/README.md (100%) rename note/{018 => 0018}/README.md (100%) rename note/{019 => 0019}/README.md (100%) rename note/{020 => 0020}/README.md (100%) rename note/{021 => 0021}/README.md (100%) rename note/{022 => 0022}/README.md (100%) rename note/{023 => 0023}/README.md (100%) rename note/{024 => 0024}/README.md (100%) rename note/{025 => 0025}/README.md (100%) rename note/{026 => 0026}/README.md (100%) rename note/{027 => 0027}/README.md (100%) rename note/{028 => 0028}/README.md (100%) rename note/{029 => 0029}/README.md (100%) rename note/{030 => 0030}/README.md (100%) rename note/{031 => 0031}/README.md (100%) rename note/{033 => 0033}/README.md (100%) rename note/{035 => 0035}/README.md (100%) rename note/{038 => 0038}/README.md (100%) rename note/{043 => 0043}/README.md (100%) rename note/{044 => 0044}/README.md (100%) rename note/{049 => 0049}/README.md (100%) rename note/{050 => 0050}/README.md (100%) rename note/{053 => 0053}/README.md (100%) rename note/{056 => 0056}/README.md (100%) rename note/{057 => 0057}/README.md (100%) rename note/{058 => 0058}/README.md (100%) rename note/{066 => 0066}/README.md (100%) rename note/{067 => 0067}/README.md (100%) rename note/{068 => 0068}/README.md (100%) rename note/{069 => 0069}/README.md (100%) rename note/{070 => 0070}/README.md (100%) rename note/{083 => 0083}/README.md (100%) rename note/{088 => 0088}/README.md (100%) rename note/{100 => 0100}/README.md (100%) rename note/{101 => 0101}/README.md (100%) rename note/{104 => 0104}/README.md (100%) rename note/{107 => 0107}/README.md (100%) rename note/{108 => 0108}/README.md (100%) rename note/{110 => 0110}/README.md (100%) rename note/{111 => 0111}/README.md (100%) rename note/{112 => 0112}/README.md (100%) rename note/{118 => 0118}/README.md (100%) rename note/{119 => 0119}/README.md (100%) rename note/{121 => 0121}/README.md (100%) rename note/{122 => 0122}/README.md (100%) create mode 100644 note/0209/README.md rename note/{543 => 0543}/README.md (100%) rename note/{554 => 0554}/README.md (100%) create mode 100644 note/1028/README.md rename src/com/blankj/easy/{_001 => _0001}/Solution.java (100%) rename src/com/blankj/easy/{_007 => _0007}/Solution.java (100%) rename src/com/blankj/easy/{_009 => _0009}/Solution.java (100%) rename src/com/blankj/easy/{_013 => _0013}/Solution.java (100%) rename src/com/blankj/easy/{_014 => _0014}/Solution.java (100%) rename src/com/blankj/easy/{_020 => _0020}/Solution.java (100%) rename src/com/blankj/easy/{_021 => _0021}/Solution.java (100%) rename src/com/blankj/easy/{_026 => _0026}/Solution.java (100%) rename src/com/blankj/easy/{_027 => _0027}/Solution.java (100%) rename src/com/blankj/easy/{_028 => _0028}/Solution.java (100%) rename src/com/blankj/easy/{_035 => _0035}/Solution.java (100%) rename src/com/blankj/easy/{_038 => _0038}/Solution.java (100%) rename src/com/blankj/easy/{_053 => _0053}/Solution.java (100%) rename src/com/blankj/easy/{_058 => _0058}/Solution.java (100%) rename src/com/blankj/easy/{_066 => _0066}/Solution.java (100%) rename src/com/blankj/easy/{_067 => _0067}/Solution.java (100%) rename src/com/blankj/easy/{_069 => _0069}/Solution.java (100%) rename src/com/blankj/easy/{_070 => _0070}/Solution.java (100%) rename src/com/blankj/easy/{_083 => _0083}/Solution.java (100%) rename src/com/blankj/easy/{_088 => _0088}/Solution.java (100%) rename src/com/blankj/easy/{_100 => _0100}/Solution.java (100%) rename src/com/blankj/easy/{_101 => _0101}/Solution.java (100%) rename src/com/blankj/easy/{_104 => _0104}/Solution.java (100%) rename src/com/blankj/easy/{_107 => _0107}/Solution.java (100%) rename src/com/blankj/easy/{_108 => _0108}/Solution.java (100%) rename src/com/blankj/easy/{_110 => _0110}/Solution.java (100%) rename src/com/blankj/easy/{_111 => _0111}/Solution.java (100%) rename src/com/blankj/easy/{_112 => _0112}/Solution.java (100%) rename src/com/blankj/easy/{_118 => _0118}/Solution.java (100%) rename src/com/blankj/easy/{_119 => _0119}/Solution.java (100%) rename src/com/blankj/easy/{_121 => _0121}/Solution.java (100%) rename src/com/blankj/easy/{_122 => _0122}/Solution.java (100%) rename src/com/blankj/easy/{_543 => _0543}/Solution.java (100%) rename src/com/blankj/hard/{_004 => _0004}/Solution.java (100%) rename src/com/blankj/hard/{_010 => _0010}/Solution.java (100%) rename src/com/blankj/hard/{_023 => _0023}/Solution.java (100%) rename src/com/blankj/hard/{_025 => _0025}/Solution.java (100%) rename src/com/blankj/hard/{_030 => _0030}/Solution.java (100%) rename src/com/blankj/hard/{_044 => _0044}/Solution.java (100%) rename src/com/blankj/hard/{_068 => _0068}/Solution.java (100%) create mode 100644 src/com/blankj/hard/_1028/Solution.java rename src/com/blankj/medium/{_002 => _0002}/Solution.java (100%) rename src/com/blankj/medium/{_003 => _0003}/Solution.java (100%) rename src/com/blankj/medium/{_005 => _0005}/Solution.java (100%) rename src/com/blankj/medium/{_006 => _0006}/Solution.java (100%) rename src/com/blankj/medium/{_008 => _0008}/Solution.java (100%) rename src/com/blankj/medium/{_011 => _0011}/Solution.java (100%) rename src/com/blankj/medium/{_012 => _0012}/Solution.java (100%) rename src/com/blankj/medium/{_015 => _0015}/Solution.java (100%) rename src/com/blankj/medium/{_016 => _0016}/Solution.java (100%) rename src/com/blankj/medium/{_017 => _0017}/Solution.java (100%) rename src/com/blankj/medium/{_018 => _0018}/Solution.java (100%) rename src/com/blankj/medium/{_019 => _0019}/Solution.java (100%) rename src/com/blankj/medium/{_022 => _0022}/Solution.java (100%) rename src/com/blankj/medium/{_024 => _0024}/Solution.java (100%) rename src/com/blankj/medium/{_029 => _0029}/Solution.java (100%) rename src/com/blankj/medium/{_033 => _0033}/Solution.java (100%) rename src/com/blankj/medium/{_043 => _0043}/Solution.java (100%) rename src/com/blankj/medium/{_049 => _0049}/Solution.java (100%) rename src/com/blankj/medium/{_050 => _0050}/Solution.java (100%) rename src/com/blankj/medium/{_056 => _0056}/Solution.java (100%) rename src/com/blankj/medium/{_057 => _0057}/Solution.java (100%) rename src/com/blankj/medium/{_554 => _0554}/Solution.java (100%) diff --git a/README.md b/README.md index 83306127..b47c19ac 100644 --- a/README.md +++ b/README.md @@ -23,87 +23,85 @@ > 非也非也, > 科举为国取士,LeetCode 为 Google 筛码工,各取所需也。 - ## Easy -| # | Title | Tag | -| :--- | :--------------------------------------- | :--------------------------------------- | -| 1 | [Two Sum][001] | Array, Hash Table | -| 7 | [Reverse Integer][007] | Math | -| 9 | [Palindrome Number][009] | Math | -| 13 | [Roman to Integer][013] | Math, String | -| 14 | [Longest Common Prefix][014] | String | -| 20 | [Valid Parentheses][020] | Stack, String | -| 21 | [Merge Two Sorted Lists][021] | Linked List | -| 26 | [Remove Duplicates from Sorted Array][026] | Array, Two Pointers | -| 27 | [Remove Element][027] | Array, Two Pointers | -| 28 | [Implement strStr()][028] | Two Pointers, String | -| 35 | [Search Insert Position][035] | String | -| 38 | [Count and Say][038] | String | -| 53 | [Maximum Subarray][053] | Array, Divide and Conquer, Dynamic Programming | -| 58 | [Length of Last Word][058] | String | -| 66 | [Plus One][066] | Array, Math | -| 67 | [Add Binary][067] | Math, String | -| 69 | [Sqrt(x)][069] | Binary Search, Math | -| 70 | [Climbing Stairs][070] | Dynamic Programming | -| 83 | [Remove Duplicates from Sorted List][083] | Linked List | -| 88 | [Merge Sorted Array][088] | Array, Two Pointers | -| 100 | [Same Tree][100] | Tree, Depth-first Search | -| 101 | [Symmetric Tree][101] | Tree, Depth-first Search, Breadth-first Search | -| 104 | [Maximum Depth of Binary Tree][104] | Tree, Depth-first Search | -| 107 | [Binary Tree Level Order Traversal II][107] | Tree, Breadth-first Search | -| 108 | [Convert Sorted Array to Binary Search Tree][108] | Tree, Depth-first Search | -| 110 | [Balanced Binary Tree][110] | Tree, Depth-first Search | -| 111 | [Minimum Depth of Binary Tree][111] | Tree, Depth-first Search, Breadth-first Search | -| 112 | [Path Sum][112] | Tree, Depth-first Search | -| 118 | [Pascal's Triangle][118] | Array | -| 119 | [Pascal's Triangle II][119] | Array | -| 121 | [Best Time to Buy and Sell Stock][121] | Array, Dynamic Programmin | -| 122 | [Best Time to Buy and Sell Stock II][122] | Array, Greedy | -| 543 | [Diameter of Binary Tree][543] | Tree | - +| # | Title | Tag | +| :--- | :---------------------------------------------------------------- | :------------------------------------------------ | +| 1 | [Two Sum][0001] | Array, Hash Table | +| 7 | [Reverse Integer][0007] | Math | +| 9 | [Palindrome Number][0009] | Math | +| 13 | [Roman to Integer][0013] | Math, String | +| 14 | [Longest Common Prefix][0014] | String | +| 20 | [Valid Parentheses][0020] | Stack, String | +| 21 | [Merge Two Sorted Lists][0021] | Linked List | +| 26 | [Remove Duplicates from Sorted Array][0026] | Array, Two Pointers | +| 27 | [Remove Element][0027] | Array, Two Pointers | +| 28 | [Implement strStr()][0028] | Two Pointers, String | +| 35 | [Search Insert Position][0035] | String | +| 38 | [Count and Say][0038] | String | +| 53 | [Maximum Subarray][0053] | Array, Divide and Conquer, Dynamic Programming | +| 58 | [Length of Last Word][0058] | String | +| 66 | [Plus One][0066] | Array, Math | +| 67 | [Add Binary][0067] | Math, String | +| 69 | [Sqrt(x)][0069] | Binary Search, Math | +| 70 | [Climbing Stairs][0070] | Dynamic Programming | +| 83 | [Remove Duplicates from Sorted List][0083] | Linked List | +| 88 | [Merge Sorted Array][0088] | Array, Two Pointers | +| 100 | [Same Tree][0100] | Tree, Depth-first Search | +| 101 | [Symmetric Tree][0101] | Tree, Depth-first Search, Breadth-first Search | +| 104 | [Maximum Depth of Binary Tree][0104] | Tree, Depth-first Search | +| 107 | [Binary Tree Level Order Traversal II][107] | Tree, Breadth-first Search | +| 108 | [Convert Sorted Array to Binary Search Tree][0108] | Tree, Depth-first Search | +| 110 | [Balanced Binary Tree][0110] | Tree, Depth-first Search | +| 111 | [Minimum Depth of Binary Tree][0111] | Tree, Depth-first Search, Breadth-first Search | +| 112 | [Path Sum][0112] | Tree, Depth-first Search | +| 118 | [Pascal's Triangle][0118] | Array | +| 119 | [Pascal's Triangle II][0119] | Array | +| 121 | [Best Time to Buy and Sell Stock][0121] | Array, Dynamic Programmin | +| 122 | [Best Time to Buy and Sell Stock II][0122] | Array, Greedy | +| 543 | [Diameter of Binary Tree][0543] | Tree | ## Medium -| # | Title | Tag | -| :--- | :--------------------------------------- | :------------------------------- | -| 2 | [Add Two Numbers][002] | Linked List, Math | -| 3 | [Longest Substring Without Repeating Characters][003] | Hash Table, Two Pointers, String | -| 5 | [Longest Palindromic Substring][005] | String, Dynamic Programming | -| 6 | [ZigZag Conversion][006] | String | -| 8 | [String to Integer (atoi)][008] | Math, String | -| 11 | [Container With Most Water][011] | Array, Two Pointers | -| 12 | [Integer to Roman][012] | Math, String | -| 15 | [3Sum][015] | Array, Two Pointers | -| 15 | [3Sum Closest][016] | Array, Two Pointers | -| 17 | [Letter Combinations of a Phone Number][017] | String, Backtracking | -| 18 | [4Sum][018] | Array, Hash Table, Two Pointers | -| 19 | [Remove Nth Node From End of List][019] | Linked List, Two Pointers | -| 22 | [Generate Parentheses][022] | String, Backtracking | -| 24 | [Swap Nodes in Pairs][024] | Linked List | -| 29 | [Divide Two Integers][029] | Math, Binary Search | -| 33 | [Search in Rotated Sorted Array][033] | Arrays, Binary Search | -| 43 | [Multiply Strings][043] | Math, String | -| 49 | [Group Anagrams][049] | Hash Table, String | -| 50 | [Pow(x, n)][050] | Math, Binary Search | -| 56 | [Merge Intervals][056] | Array, Sort | -| 554 | [Brick Wall][554] | Hash Table | -| 1014 | [最佳观光组合][1014] | 数组 | - +| # | Title | Tag | +| :--- | :---------------------------------------------------------------- | :------------------------------------------------ | +| 2 | [Add Two Numbers][0002] | Linked List, Math | +| 3 | [Longest Substring Without Repeating Characters][0003] | Hash Table, Two Pointers, String | +| 5 | [Longest Palindromic Substring][0005] | String, Dynamic Programming | +| 6 | [ZigZag Conversion][0006] | String | +| 8 | [String to Integer (atoi)][0008] | Math, String | +| 11 | [Container With Most Water][0011] | Array, Two Pointers | +| 12 | [Integer to Roman][0012] | Math, String | +| 15 | [3Sum][0015] | Array, Two Pointers | +| 15 | [3Sum Closest][0016] | Array, Two Pointers | +| 17 | [Letter Combinations of a Phone Number][0017] | String, Backtracking | +| 18 | [4Sum][0018] | Array, Hash Table, Two Pointers | +| 19 | [Remove Nth Node From End of List][0019] | Linked List, Two Pointers | +| 22 | [Generate Parentheses][0022] | String, Backtracking | +| 24 | [Swap Nodes in Pairs][0024] | Linked List | +| 29 | [Divide Two Integers][0029] | Math, Binary Search | +| 33 | [Search in Rotated Sorted Array][0033] | Arrays, Binary Search | +| 43 | [Multiply Strings][0043] | Math, String | +| 49 | [Group Anagrams][0049] | Hash Table, String | +| 50 | [Pow(x, n)][0050] | Math, Binary Search | +| 56 | [Merge Intervals][0056] | Array, Sort | +| 209 | [长度最小的子数组(Minimum Size Subarray Sum)][0209] | Array, Sort | +| 554 | [Brick Wall][0554] | Hash Table | +| 1014 | [最佳观光组合(Best Sightseeing Pair)][1014] | 数组 | ## Hard -| # | Title | Tag | -| :--- | :--------------------------------------- | :--------------------------------------- | -| 4 | [Median of Two Sorted Arrays][004] | Array, Binary Search, Divide and Conquer | -| 10 | [Regular Expression Matching][010] | String, Dynamic Programming, Backtracking | -| 23 | [Merge k Sorted Lists][023] | Linked List, Divide and Conquer, Heap | -| 25 | [Reverse Nodes in k-Group][025] | Linked List | -| 30 | [Substring with Concatenation of All Words][030] | Hash Table, Two Pointers, String | -| 44 | [Wildcard Matching][044] | String, Dynamic Programming, Backtracking, Greedy | -| 57 | [Insert Interval][057] | Array, Sort | -| 68 | [Text Justification][068] | String | - +| # | Title | Tag | +| :--- | :---------------------------------------------------------------- | :------------------------------------------------ | +| 4 | [Median of Two Sorted Arrays][0004] | Array, Binary Search, Divide and Conquer | +| 10 | [Regular Expression Matching][0010] | String, Dynamic Programming, Backtracking | +| 23 | [Merge k Sorted Lists][0023] | Linked List, Divide and Conquer, Heap | +| 25 | [Reverse Nodes in k-Group][0025] | Linked List | +| 30 | [Substring with Concatenation of All Words][0030] | Hash Table, Two Pointers, String | +| 44 | [Wildcard Matching][0044] | String, Dynamic Programming, Backtracking, Greedy | +| 57 | [Insert Interval][0057] | Array, Sort | +| 68 | [Text Justification][0068] | String | +| 1028 | [从先序遍历还原二叉树(Recover a Tree From Preorder Traversal)][1028] | 树、深度优先搜索 | ## 打个小广告 @@ -116,68 +114,69 @@ [note]: https://github.com/Blankj/awesome-java-leetcode/tree/master/note [companies]: https://github.com/Blankj/awesome-java-leetcode/blob/master/Companies.md -[001]: https://github.com/Blankj/awesome-java-leetcode/blob/master/note/001/README.md -[007]: https://github.com/Blankj/awesome-java-leetcode/blob/master/note/007/README.md -[009]: https://github.com/Blankj/awesome-java-leetcode/blob/master/note/009/README.md -[013]: https://github.com/Blankj/awesome-java-leetcode/blob/master/note/013/README.md -[014]: https://github.com/Blankj/awesome-java-leetcode/blob/master/note/014/README.md -[020]: https://github.com/Blankj/awesome-java-leetcode/blob/master/note/020/README.md -[021]: https://github.com/Blankj/awesome-java-leetcode/blob/master/note/021/README.md -[026]: https://github.com/Blankj/awesome-java-leetcode/blob/master/note/026/README.md -[027]: https://github.com/Blankj/awesome-java-leetcode/blob/master/note/027/README.md -[028]: https://github.com/Blankj/awesome-java-leetcode/blob/master/note/028/README.md -[035]: https://github.com/Blankj/awesome-java-leetcode/blob/master/note/035/README.md -[038]: https://github.com/Blankj/awesome-java-leetcode/blob/master/note/038/README.md -[053]: https://github.com/Blankj/awesome-java-leetcode/blob/master/note/053/README.md -[058]: https://github.com/Blankj/awesome-java-leetcode/blob/master/note/058/README.md -[066]: https://github.com/Blankj/awesome-java-leetcode/blob/master/note/066/README.md -[067]: https://github.com/Blankj/awesome-java-leetcode/blob/master/note/067/README.md -[069]: https://github.com/Blankj/awesome-java-leetcode/blob/master/note/069/README.md -[070]: https://github.com/Blankj/awesome-java-leetcode/blob/master/note/070/README.md -[083]: https://github.com/Blankj/awesome-java-leetcode/blob/master/note/083/README.md -[088]: https://github.com/Blankj/awesome-java-leetcode/blob/master/note/088/README.md -[100]: https://github.com/Blankj/awesome-java-leetcode/blob/master/note/100/README.md -[101]: https://github.com/Blankj/awesome-java-leetcode/blob/master/note/101/README.md -[104]: https://github.com/Blankj/awesome-java-leetcode/blob/master/note/104/README.md -[107]: https://github.com/Blankj/awesome-java-leetcode/blob/master/note/107/README.md -[108]: https://github.com/Blankj/awesome-java-leetcode/blob/master/note/108/README.md -[110]: https://github.com/Blankj/awesome-java-leetcode/blob/master/note/110/README.md -[111]: https://github.com/Blankj/awesome-java-leetcode/blob/master/note/111/README.md -[112]: https://github.com/Blankj/awesome-java-leetcode/blob/master/note/112/README.md -[118]: https://github.com/Blankj/awesome-java-leetcode/blob/master/note/118/README.md -[119]: https://github.com/Blankj/awesome-java-leetcode/blob/master/note/119/README.md -[121]: https://github.com/Blankj/awesome-java-leetcode/blob/master/note/121/README.md -[122]: https://github.com/Blankj/awesome-java-leetcode/blob/master/note/122/README.md -[543]: https://github.com/Blankj/awesome-java-leetcode/blob/master/note/543/README.md - -[002]: https://github.com/Blankj/awesome-java-leetcode/blob/master/note/002/README.md -[003]: https://github.com/Blankj/awesome-java-leetcode/blob/master/note/003/README.md -[005]: https://github.com/Blankj/awesome-java-leetcode/blob/master/note/005/README.md -[006]: https://github.com/Blankj/awesome-java-leetcode/blob/master/note/006/README.md -[008]: https://github.com/Blankj/awesome-java-leetcode/blob/master/note/008/README.md -[011]: https://github.com/Blankj/awesome-java-leetcode/blob/master/note/011/README.md -[012]: https://github.com/Blankj/awesome-java-leetcode/blob/master/note/012/README.md -[015]: https://github.com/Blankj/awesome-java-leetcode/blob/master/note/015/README.md -[016]: https://github.com/Blankj/awesome-java-leetcode/blob/master/note/016/README.md -[017]: https://github.com/Blankj/awesome-java-leetcode/blob/master/note/017/README.md -[018]: https://github.com/Blankj/awesome-java-leetcode/blob/master/note/018/README.md -[019]: https://github.com/Blankj/awesome-java-leetcode/blob/master/note/019/README.md -[022]: https://github.com/Blankj/awesome-java-leetcode/blob/master/note/022/README.md -[024]: https://github.com/Blankj/awesome-java-leetcode/blob/master/note/024/README.md -[029]: https://github.com/Blankj/awesome-java-leetcode/blob/master/note/029/README.md -[033]: https://github.com/Blankj/awesome-java-leetcode/blob/master/note/033/README.md -[043]: https://github.com/Blankj/awesome-java-leetcode/blob/master/note/043/README.md -[049]: https://github.com/Blankj/awesome-java-leetcode/blob/master/note/049/README.md -[050]: https://github.com/Blankj/awesome-java-leetcode/blob/master/note/050/README.md -[056]: https://github.com/Blankj/awesome-java-leetcode/blob/master/note/056/README.md -[554]: https://github.com/Blankj/awesome-java-leetcode/blob/master/note/554/README.md +[0001]: https://github.com/Blankj/awesome-java-leetcode/blob/master/note/0001/README.md +[0007]: https://github.com/Blankj/awesome-java-leetcode/blob/master/note/0007/README.md +[0009]: https://github.com/Blankj/awesome-java-leetcode/blob/master/note/0009/README.md +[0013]: https://github.com/Blankj/awesome-java-leetcode/blob/master/note/0013/README.md +[0014]: https://github.com/Blankj/awesome-java-leetcode/blob/master/note/0014/README.md +[0020]: https://github.com/Blankj/awesome-java-leetcode/blob/master/note/0020/README.md +[0021]: https://github.com/Blankj/awesome-java-leetcode/blob/master/note/0021/README.md +[0026]: https://github.com/Blankj/awesome-java-leetcode/blob/master/note/0026/README.md +[0027]: https://github.com/Blankj/awesome-java-leetcode/blob/master/note/0027/README.md +[0028]: https://github.com/Blankj/awesome-java-leetcode/blob/master/note/0028/README.md +[0035]: https://github.com/Blankj/awesome-java-leetcode/blob/master/note/0035/README.md +[0038]: https://github.com/Blankj/awesome-java-leetcode/blob/master/note/0038/README.md +[0053]: https://github.com/Blankj/awesome-java-leetcode/blob/master/note/0053/README.md +[0058]: https://github.com/Blankj/awesome-java-leetcode/blob/master/note/0058/README.md +[0066]: https://github.com/Blankj/awesome-java-leetcode/blob/master/note/0066/README.md +[0067]: https://github.com/Blankj/awesome-java-leetcode/blob/master/note/0067/README.md +[0069]: https://github.com/Blankj/awesome-java-leetcode/blob/master/note/0069/README.md +[0070]: https://github.com/Blankj/awesome-java-leetcode/blob/master/note/0070/README.md +[0083]: https://github.com/Blankj/awesome-java-leetcode/blob/master/note/0083/README.md +[0088]: https://github.com/Blankj/awesome-java-leetcode/blob/master/note/0088/README.md +[0100]: https://github.com/Blankj/awesome-java-leetcode/blob/master/note/0100/README.md +[0101]: https://github.com/Blankj/awesome-java-leetcode/blob/master/note/0101/README.md +[0104]: https://github.com/Blankj/awesome-java-leetcode/blob/master/note/0104/README.md +[0107]: https://github.com/Blankj/awesome-java-leetcode/blob/master/note/0107/README.md +[0108]: https://github.com/Blankj/awesome-java-leetcode/blob/master/note/0108/README.md +[0110]: https://github.com/Blankj/awesome-java-leetcode/blob/master/note/0110/README.md +[0111]: https://github.com/Blankj/awesome-java-leetcode/blob/master/note/0111/README.md +[0112]: https://github.com/Blankj/awesome-java-leetcode/blob/master/note/0112/README.md +[0118]: https://github.com/Blankj/awesome-java-leetcode/blob/master/note/0118/README.md +[0119]: https://github.com/Blankj/awesome-java-leetcode/blob/master/note/0119/README.md +[0121]: https://github.com/Blankj/awesome-java-leetcode/blob/master/note/0121/README.md +[0122]: https://github.com/Blankj/awesome-java-leetcode/blob/master/note/0122/README.md +[0543]: https://github.com/Blankj/awesome-java-leetcode/blob/master/note/0543/README.md + +[0002]: https://github.com/Blankj/awesome-java-leetcode/blob/master/note/0002/README.md +[0003]: https://github.com/Blankj/awesome-java-leetcode/blob/master/note/0003/README.md +[0005]: https://github.com/Blankj/awesome-java-leetcode/blob/master/note/0005/README.md +[0006]: https://github.com/Blankj/awesome-java-leetcode/blob/master/note/0006/README.md +[0008]: https://github.com/Blankj/awesome-java-leetcode/blob/master/note/0008/README.md +[0011]: https://github.com/Blankj/awesome-java-leetcode/blob/master/note/0011/README.md +[0012]: https://github.com/Blankj/awesome-java-leetcode/blob/master/note/0012/README.md +[0015]: https://github.com/Blankj/awesome-java-leetcode/blob/master/note/0015/README.md +[0016]: https://github.com/Blankj/awesome-java-leetcode/blob/master/note/0016/README.md +[0017]: https://github.com/Blankj/awesome-java-leetcode/blob/master/note/0017/README.md +[0018]: https://github.com/Blankj/awesome-java-leetcode/blob/master/note/0018/README.md +[0019]: https://github.com/Blankj/awesome-java-leetcode/blob/master/note/0019/README.md +[0022]: https://github.com/Blankj/awesome-java-leetcode/blob/master/note/0022/README.md +[0024]: https://github.com/Blankj/awesome-java-leetcode/blob/master/note/0024/README.md +[0029]: https://github.com/Blankj/awesome-java-leetcode/blob/master/note/0029/README.md +[0033]: https://github.com/Blankj/awesome-java-leetcode/blob/master/note/0033/README.md +[0043]: https://github.com/Blankj/awesome-java-leetcode/blob/master/note/0043/README.md +[0049]: https://github.com/Blankj/awesome-java-leetcode/blob/master/note/0049/README.md +[0050]: https://github.com/Blankj/awesome-java-leetcode/blob/master/note/0050/README.md +[0056]: https://github.com/Blankj/awesome-java-leetcode/blob/master/note/0056/README.md +[0554]: https://github.com/Blankj/awesome-java-leetcode/blob/master/note/0554/README.md [1014]: https://github.com/Blankj/awesome-java-leetcode/blob/master/note/1014/README.md - -[004]: https://github.com/Blankj/awesome-java-leetcode/blob/master/note/004/README.md -[010]: https://github.com/Blankj/awesome-java-leetcode/blob/master/note/010/README.md -[023]: https://github.com/Blankj/awesome-java-leetcode/blob/master/note/023/README.md -[025]: https://github.com/Blankj/awesome-java-leetcode/blob/master/note/025/README.md -[030]: https://github.com/Blankj/awesome-java-leetcode/blob/master/note/030/README.md -[044]: https://github.com/Blankj/awesome-java-leetcode/blob/master/note/044/README.md -[057]: https://github.com/Blankj/awesome-java-leetcode/blob/master/note/057/README.md -[068]: https://github.com/Blankj/awesome-java-leetcode/blob/master/note/068/README.md +[0004]: https://github.com/Blankj/awesome-java-leetcode/blob/master/note/0004/README.md +[0010]: https://github.com/Blankj/awesome-java-leetcode/blob/master/note/0010/README.md + +[0023]: https://github.com/Blankj/awesome-java-leetcode/blob/master/note/0023/README.md +[0025]: https://github.com/Blankj/awesome-java-leetcode/blob/master/note/0025/README.md +[0030]: https://github.com/Blankj/awesome-java-leetcode/blob/master/note/0030/README.md +[0044]: https://github.com/Blankj/awesome-java-leetcode/blob/master/note/0044/README.md +[0057]: https://github.com/Blankj/awesome-java-leetcode/blob/master/note/0057/README.md +[0068]: https://github.com/Blankj/awesome-java-leetcode/blob/master/note/0068/README.md +[1028]: https://github.com/Blankj/awesome-java-leetcode/blob/master/note/1028/README.md \ No newline at end of file diff --git a/note/001/README.md b/note/0001/README.md similarity index 100% rename from note/001/README.md rename to note/0001/README.md diff --git a/note/002/README.md b/note/0002/README.md similarity index 100% rename from note/002/README.md rename to note/0002/README.md diff --git a/note/003/README.md b/note/0003/README.md similarity index 100% rename from note/003/README.md rename to note/0003/README.md diff --git a/note/004/README.md b/note/0004/README.md similarity index 100% rename from note/004/README.md rename to note/0004/README.md diff --git a/note/004/my_draw.jpg b/note/0004/my_draw.jpg similarity index 100% rename from note/004/my_draw.jpg rename to note/0004/my_draw.jpg diff --git a/note/005/README.md b/note/0005/README.md similarity index 100% rename from note/005/README.md rename to note/0005/README.md diff --git a/note/006/README.md b/note/0006/README.md similarity index 100% rename from note/006/README.md rename to note/0006/README.md diff --git a/note/007/README.md b/note/0007/README.md similarity index 100% rename from note/007/README.md rename to note/0007/README.md diff --git a/note/008/README.md b/note/0008/README.md similarity index 100% rename from note/008/README.md rename to note/0008/README.md diff --git a/note/009/README.md b/note/0009/README.md similarity index 100% rename from note/009/README.md rename to note/0009/README.md diff --git a/note/010/README.md b/note/0010/README.md similarity index 100% rename from note/010/README.md rename to note/0010/README.md diff --git a/note/011/README.md b/note/0011/README.md similarity index 100% rename from note/011/README.md rename to note/0011/README.md diff --git a/note/011/water.png b/note/0011/water.png similarity index 100% rename from note/011/water.png rename to note/0011/water.png diff --git a/note/012/README.md b/note/0012/README.md similarity index 100% rename from note/012/README.md rename to note/0012/README.md diff --git a/note/013/README.md b/note/0013/README.md similarity index 100% rename from note/013/README.md rename to note/0013/README.md diff --git a/note/014/README.md b/note/0014/README.md similarity index 100% rename from note/014/README.md rename to note/0014/README.md diff --git a/note/015/README.md b/note/0015/README.md similarity index 100% rename from note/015/README.md rename to note/0015/README.md diff --git a/note/016/README.md b/note/0016/README.md similarity index 100% rename from note/016/README.md rename to note/0016/README.md diff --git a/note/017/README.md b/note/0017/README.md similarity index 100% rename from note/017/README.md rename to note/0017/README.md diff --git a/note/018/README.md b/note/0018/README.md similarity index 100% rename from note/018/README.md rename to note/0018/README.md diff --git a/note/019/README.md b/note/0019/README.md similarity index 100% rename from note/019/README.md rename to note/0019/README.md diff --git a/note/020/README.md b/note/0020/README.md similarity index 100% rename from note/020/README.md rename to note/0020/README.md diff --git a/note/021/README.md b/note/0021/README.md similarity index 100% rename from note/021/README.md rename to note/0021/README.md diff --git a/note/022/README.md b/note/0022/README.md similarity index 100% rename from note/022/README.md rename to note/0022/README.md diff --git a/note/023/README.md b/note/0023/README.md similarity index 100% rename from note/023/README.md rename to note/0023/README.md diff --git a/note/024/README.md b/note/0024/README.md similarity index 100% rename from note/024/README.md rename to note/0024/README.md diff --git a/note/025/README.md b/note/0025/README.md similarity index 100% rename from note/025/README.md rename to note/0025/README.md diff --git a/note/026/README.md b/note/0026/README.md similarity index 100% rename from note/026/README.md rename to note/0026/README.md diff --git a/note/027/README.md b/note/0027/README.md similarity index 100% rename from note/027/README.md rename to note/0027/README.md diff --git a/note/028/README.md b/note/0028/README.md similarity index 100% rename from note/028/README.md rename to note/0028/README.md diff --git a/note/029/README.md b/note/0029/README.md similarity index 100% rename from note/029/README.md rename to note/0029/README.md diff --git a/note/030/README.md b/note/0030/README.md similarity index 100% rename from note/030/README.md rename to note/0030/README.md diff --git a/note/031/README.md b/note/0031/README.md similarity index 100% rename from note/031/README.md rename to note/0031/README.md diff --git a/note/033/README.md b/note/0033/README.md similarity index 100% rename from note/033/README.md rename to note/0033/README.md diff --git a/note/035/README.md b/note/0035/README.md similarity index 100% rename from note/035/README.md rename to note/0035/README.md diff --git a/note/038/README.md b/note/0038/README.md similarity index 100% rename from note/038/README.md rename to note/0038/README.md diff --git a/note/043/README.md b/note/0043/README.md similarity index 100% rename from note/043/README.md rename to note/0043/README.md diff --git a/note/044/README.md b/note/0044/README.md similarity index 100% rename from note/044/README.md rename to note/0044/README.md diff --git a/note/049/README.md b/note/0049/README.md similarity index 100% rename from note/049/README.md rename to note/0049/README.md diff --git a/note/050/README.md b/note/0050/README.md similarity index 100% rename from note/050/README.md rename to note/0050/README.md diff --git a/note/053/README.md b/note/0053/README.md similarity index 100% rename from note/053/README.md rename to note/0053/README.md diff --git a/note/056/README.md b/note/0056/README.md similarity index 100% rename from note/056/README.md rename to note/0056/README.md diff --git a/note/057/README.md b/note/0057/README.md similarity index 100% rename from note/057/README.md rename to note/0057/README.md diff --git a/note/058/README.md b/note/0058/README.md similarity index 100% rename from note/058/README.md rename to note/0058/README.md diff --git a/note/066/README.md b/note/0066/README.md similarity index 100% rename from note/066/README.md rename to note/0066/README.md diff --git a/note/067/README.md b/note/0067/README.md similarity index 100% rename from note/067/README.md rename to note/0067/README.md diff --git a/note/068/README.md b/note/0068/README.md similarity index 100% rename from note/068/README.md rename to note/0068/README.md diff --git a/note/069/README.md b/note/0069/README.md similarity index 100% rename from note/069/README.md rename to note/0069/README.md diff --git a/note/070/README.md b/note/0070/README.md similarity index 100% rename from note/070/README.md rename to note/0070/README.md diff --git a/note/083/README.md b/note/0083/README.md similarity index 100% rename from note/083/README.md rename to note/0083/README.md diff --git a/note/088/README.md b/note/0088/README.md similarity index 100% rename from note/088/README.md rename to note/0088/README.md diff --git a/note/100/README.md b/note/0100/README.md similarity index 100% rename from note/100/README.md rename to note/0100/README.md diff --git a/note/101/README.md b/note/0101/README.md similarity index 100% rename from note/101/README.md rename to note/0101/README.md diff --git a/note/104/README.md b/note/0104/README.md similarity index 100% rename from note/104/README.md rename to note/0104/README.md diff --git a/note/107/README.md b/note/0107/README.md similarity index 100% rename from note/107/README.md rename to note/0107/README.md diff --git a/note/108/README.md b/note/0108/README.md similarity index 100% rename from note/108/README.md rename to note/0108/README.md diff --git a/note/110/README.md b/note/0110/README.md similarity index 100% rename from note/110/README.md rename to note/0110/README.md diff --git a/note/111/README.md b/note/0111/README.md similarity index 100% rename from note/111/README.md rename to note/0111/README.md diff --git a/note/112/README.md b/note/0112/README.md similarity index 100% rename from note/112/README.md rename to note/0112/README.md diff --git a/note/118/README.md b/note/0118/README.md similarity index 100% rename from note/118/README.md rename to note/0118/README.md diff --git a/note/119/README.md b/note/0119/README.md similarity index 100% rename from note/119/README.md rename to note/0119/README.md diff --git a/note/121/README.md b/note/0121/README.md similarity index 100% rename from note/121/README.md rename to note/0121/README.md diff --git a/note/122/README.md b/note/0122/README.md similarity index 100% rename from note/122/README.md rename to note/0122/README.md diff --git a/note/0209/README.md b/note/0209/README.md new file mode 100644 index 00000000..4c7dedcd --- /dev/null +++ b/note/0209/README.md @@ -0,0 +1,81 @@ +# [长度最小的子数组][title] + +## 题目描述 + +我们从二叉树的根节点 `root` 开始进行深度优先搜索。 + +在遍历中的每个节点处,我们输出 `D` 条短划线(其中 `D` 是该节点的深度),然后输出该节点的值。(_如果节点的深度为 `D`,则其直接子节点的深度为 `D + 1`。根节点的深度为 `0`)。_ + +如果节点只有一个子节点,那么保证该子节点为左子节点。 + +给出遍历输出 `S`,还原树并返回其根节点 `root`。 + +**示例 1:** + +**![](https://assets.leetcode-cn.com/aliyun-lc-upload/uploads/2019/04/12/recover-a-tree-from-preorder-traversal.png)** + +``` +输入:"1-2--3--4-5--6--7" +输出:[1,2,5,3,4,6,7] +``` + +**示例 2:** + +**![](https://assets.leetcode-cn.com/aliyun-lc-upload/uploads/2019/04/12/screen-shot-2019-04-10-at-114101-pm.png)** + +``` +输入:"1-2--3---4-5--6---7" +输出:[1,2,5,3,null,6,null,4,null,7] +``` + +**示例 3:** + +![](https://assets.leetcode-cn.com/aliyun-lc-upload/uploads/2019/04/12/screen-shot-2019-04-10-at-114955-pm.png) + +``` +输入:"1-401--349---90--88" +输出:[1,401,null,349,88,90] +``` + +**提示:** + +* 原始树中的节点数介于 `1` 和 `1000` 之间。 +* 每个节点的值介于 `1` 和 `10 ^ 9` 之间。 + +**标签:** 树、深度优先搜索 + + +## 思路 + +直接暴力两层 for 循环肯定过不了关,我们把公式变化为 `(A[i] + i) + (A[j] - j)`,看到此应该就可以想到在每次遍历 `j` 时,只需要知道 `max(A[i] + i)` 即可。 + +```java +class Solution { + + public int maxScoreSightseeingPair(int[] A) { + int ans = 0, cur = A[0] + 0; + for (int j = 1; j < A.length; j++) { + ans = Math.max(ans, cur + A[j] - j); // 计算当前最大得分 + cur = Math.max(cur, A[j] + j); // 更新最大的 A[i] + i + } + return ans; + } + + public static void main(String[] args) { + Solution solution = new Solution(); + int[] A = new int[]{8, 1, 5, 2, 6}; + System.out.println(solution.maxScoreSightseeingPair(A)); + } +} + +``` + + +## 结语 + +如果你同我一样热爱数据结构、算法、LeetCode,可以关注我 GitHub 上的 LeetCode 题解:[awesome-java-leetcode][ajl] + + + +[title]: https://leetcode-cn.com/problems/recover-a-tree-from-preorder-traversal +[ajl]: https://github.com/Blankj/awesome-java-leetcode diff --git a/note/543/README.md b/note/0543/README.md similarity index 100% rename from note/543/README.md rename to note/0543/README.md diff --git a/note/554/README.md b/note/0554/README.md similarity index 100% rename from note/554/README.md rename to note/0554/README.md diff --git a/note/1014/README.md b/note/1014/README.md index 61a05d0a..34357d6c 100644 --- a/note/1014/README.md +++ b/note/1014/README.md @@ -1,4 +1,4 @@ -# [最佳观光组合][title] +# [最佳观光组合(Best Sightseeing Pair)][title] ## 题目描述 @@ -56,5 +56,5 @@ class Solution { -[title]: https://leetcode-cn.com/problems/best-sightseeing-pair/ +[title]: https://leetcode-cn.com/problems/best-sightseeing-pair [ajl]: https://github.com/Blankj/awesome-java-leetcode diff --git a/note/1028/README.md b/note/1028/README.md new file mode 100644 index 00000000..aaa185ba --- /dev/null +++ b/note/1028/README.md @@ -0,0 +1,148 @@ +# [从先序遍历还原二叉树][title] + +## 题目描述 + +我们从二叉树的根节点 `root` 开始进行深度优先搜索。 + +在遍历中的每个节点处,我们输出 `D` 条短划线(其中 `D` 是该节点的深度),然后输出该节点的值。(_如果节点的深度为 `D`,则其直接子节点的深度为 `D + 1`。根节点的深度为 `0`)。_ + +如果节点只有一个子节点,那么保证该子节点为左子节点。 + +给出遍历输出 `S`,还原树并返回其根节点 `root`。 + +**示例 1:** + +**![](https://assets.leetcode-cn.com/aliyun-lc-upload/uploads/2019/04/12/recover-a-tree-from-preorder-traversal.png)** + +``` +输入:"1-2--3--4-5--6--7" +输出:[1,2,5,3,4,6,7] +``` + +**示例 2:** + +**![](https://assets.leetcode-cn.com/aliyun-lc-upload/uploads/2019/04/12/screen-shot-2019-04-10-at-114101-pm.png)** + +``` +输入:"1-2--3---4-5--6---7" +输出:[1,2,5,3,null,6,null,4,null,7] +``` + +**示例 3:** + +![](https://assets.leetcode-cn.com/aliyun-lc-upload/uploads/2019/04/12/screen-shot-2019-04-10-at-114955-pm.png) + +``` +输入:"1-401--349---90--88" +输出:[1,401,null,349,88,90] +``` + +**提示:** + +* 原始树中的节点数介于 `1` 和 `1000` 之间。 +* 每个节点的值介于 `1` 和 `10 ^ 9` 之间。 + +**标签:** 树、深度优先搜索 + + +## 思路 0 + +主要就是根据先序遍历如何把树构建出来,其最主要就是找到当前待插入节点它爹,优先插入到它爹的左子节点,我们可以用一个链表来做辅助,该链表索引代表层级,元素存放其节点,由于是先序遍历(根-左-右),也就是右覆盖左时,此时左树已遍历完成,故无需考虑覆盖问题,利用该链表,我们根据层级便可轻松找到它爹,具体如下所示: + +```java +/** + * Definition for a binary tree node. + * public class TreeNode { + * int val; + * TreeNode left; + * TreeNode right; + * TreeNode(int x) { val = x; } + * } + */ +public class Solution { + public TreeNode recoverFromPreorder(String S) { + char[] chars = S.toCharArray(); + int len = chars.length; + List levels = new LinkedList<>(); + for (int i = 0; i < len; ) { + int level = 0, val = 0; + while (chars[i] == '-') { // 获取所在层级,Character.isDigit() 会比较慢 + ++i; + ++level; + } + while (i < len && chars[i] != '-') { // 获取节点的值 + val = val * 10 + chars[i++] - '0'; + } + TreeNode curNode = new TreeNode(val); + if (level > 0) { + TreeNode parent = levels.get(level - 1); + if (parent.left == null) { // 如果节点只有一个子节点,那么保证该子节点为左子节点。 + parent.left = curNode; + } else { + parent.right = curNode; + } + } + levels.add(level, curNode); // 因为是先序遍历(根-左-右),也就是右覆盖左时,此时左树已遍历完成,故无需考虑覆盖问题 + } + return levels.get(0); + } +} +``` + + +## 思路 1 + +基于上面的思路,其实我们没有必要把所有层级都保存下来,由于是先序遍历,在找待插入节点它爹时,我们可以把不小于它层级的元素都删除,基于此,用一个辅助栈便可完成寻爹之旅,具体如下所示: + +```java +/** + * Definition for a binary tree node. + * public class TreeNode { + * int val; + * TreeNode left; + * TreeNode right; + * TreeNode(int x) { val = x; } + * } + */ +public class Solution { + public TreeNode recoverFromPreorder(String S) { + char[] chars = S.toCharArray(); + int len = chars.length; + LinkedList stack = new LinkedList<>(); + for (int i = 0; i < len; ) { + int level = 0, val = 0; + while (chars[i] == '-') { // 获取所在层级,Character.isDigit() 会比较慢 + ++i; + ++level; + } + while (i < len && chars[i] != '-') { // 获取节点的值 + val = val * 10 + chars[i++] - '0'; + } + TreeNode curNode = new TreeNode(val); + while (stack.size() > level) { // 栈顶不是父亲,栈顶出栈 + stack.removeLast(); + } + if (level > 0) { + TreeNode parent = stack.getLast(); + if (parent.left == null) { // 如果节点只有一个子节点,那么保证该子节点为左子节点。 + parent.left = curNode; + } else { + parent.right = curNode; + } + } + stack.addLast(curNode); + } + return stack.get(0); + } +} +``` + + +## 结语 + +如果你同我一样热爱数据结构、算法、LeetCode,可以关注我 GitHub 上的 LeetCode 题解:[awesome-java-leetcode][ajl] + + + +[title]: https://leetcode-cn.com/problems/recover-a-tree-from-preorder-traversal +[ajl]: https://github.com/Blankj/awesome-java-leetcode diff --git a/src/com/blankj/easy/_001/Solution.java b/src/com/blankj/easy/_0001/Solution.java similarity index 100% rename from src/com/blankj/easy/_001/Solution.java rename to src/com/blankj/easy/_0001/Solution.java diff --git a/src/com/blankj/easy/_007/Solution.java b/src/com/blankj/easy/_0007/Solution.java similarity index 100% rename from src/com/blankj/easy/_007/Solution.java rename to src/com/blankj/easy/_0007/Solution.java diff --git a/src/com/blankj/easy/_009/Solution.java b/src/com/blankj/easy/_0009/Solution.java similarity index 100% rename from src/com/blankj/easy/_009/Solution.java rename to src/com/blankj/easy/_0009/Solution.java diff --git a/src/com/blankj/easy/_013/Solution.java b/src/com/blankj/easy/_0013/Solution.java similarity index 100% rename from src/com/blankj/easy/_013/Solution.java rename to src/com/blankj/easy/_0013/Solution.java diff --git a/src/com/blankj/easy/_014/Solution.java b/src/com/blankj/easy/_0014/Solution.java similarity index 100% rename from src/com/blankj/easy/_014/Solution.java rename to src/com/blankj/easy/_0014/Solution.java diff --git a/src/com/blankj/easy/_020/Solution.java b/src/com/blankj/easy/_0020/Solution.java similarity index 100% rename from src/com/blankj/easy/_020/Solution.java rename to src/com/blankj/easy/_0020/Solution.java diff --git a/src/com/blankj/easy/_021/Solution.java b/src/com/blankj/easy/_0021/Solution.java similarity index 100% rename from src/com/blankj/easy/_021/Solution.java rename to src/com/blankj/easy/_0021/Solution.java diff --git a/src/com/blankj/easy/_026/Solution.java b/src/com/blankj/easy/_0026/Solution.java similarity index 100% rename from src/com/blankj/easy/_026/Solution.java rename to src/com/blankj/easy/_0026/Solution.java diff --git a/src/com/blankj/easy/_027/Solution.java b/src/com/blankj/easy/_0027/Solution.java similarity index 100% rename from src/com/blankj/easy/_027/Solution.java rename to src/com/blankj/easy/_0027/Solution.java diff --git a/src/com/blankj/easy/_028/Solution.java b/src/com/blankj/easy/_0028/Solution.java similarity index 100% rename from src/com/blankj/easy/_028/Solution.java rename to src/com/blankj/easy/_0028/Solution.java diff --git a/src/com/blankj/easy/_035/Solution.java b/src/com/blankj/easy/_0035/Solution.java similarity index 100% rename from src/com/blankj/easy/_035/Solution.java rename to src/com/blankj/easy/_0035/Solution.java diff --git a/src/com/blankj/easy/_038/Solution.java b/src/com/blankj/easy/_0038/Solution.java similarity index 100% rename from src/com/blankj/easy/_038/Solution.java rename to src/com/blankj/easy/_0038/Solution.java diff --git a/src/com/blankj/easy/_053/Solution.java b/src/com/blankj/easy/_0053/Solution.java similarity index 100% rename from src/com/blankj/easy/_053/Solution.java rename to src/com/blankj/easy/_0053/Solution.java diff --git a/src/com/blankj/easy/_058/Solution.java b/src/com/blankj/easy/_0058/Solution.java similarity index 100% rename from src/com/blankj/easy/_058/Solution.java rename to src/com/blankj/easy/_0058/Solution.java diff --git a/src/com/blankj/easy/_066/Solution.java b/src/com/blankj/easy/_0066/Solution.java similarity index 100% rename from src/com/blankj/easy/_066/Solution.java rename to src/com/blankj/easy/_0066/Solution.java diff --git a/src/com/blankj/easy/_067/Solution.java b/src/com/blankj/easy/_0067/Solution.java similarity index 100% rename from src/com/blankj/easy/_067/Solution.java rename to src/com/blankj/easy/_0067/Solution.java diff --git a/src/com/blankj/easy/_069/Solution.java b/src/com/blankj/easy/_0069/Solution.java similarity index 100% rename from src/com/blankj/easy/_069/Solution.java rename to src/com/blankj/easy/_0069/Solution.java diff --git a/src/com/blankj/easy/_070/Solution.java b/src/com/blankj/easy/_0070/Solution.java similarity index 100% rename from src/com/blankj/easy/_070/Solution.java rename to src/com/blankj/easy/_0070/Solution.java diff --git a/src/com/blankj/easy/_083/Solution.java b/src/com/blankj/easy/_0083/Solution.java similarity index 100% rename from src/com/blankj/easy/_083/Solution.java rename to src/com/blankj/easy/_0083/Solution.java diff --git a/src/com/blankj/easy/_088/Solution.java b/src/com/blankj/easy/_0088/Solution.java similarity index 100% rename from src/com/blankj/easy/_088/Solution.java rename to src/com/blankj/easy/_0088/Solution.java diff --git a/src/com/blankj/easy/_100/Solution.java b/src/com/blankj/easy/_0100/Solution.java similarity index 100% rename from src/com/blankj/easy/_100/Solution.java rename to src/com/blankj/easy/_0100/Solution.java diff --git a/src/com/blankj/easy/_101/Solution.java b/src/com/blankj/easy/_0101/Solution.java similarity index 100% rename from src/com/blankj/easy/_101/Solution.java rename to src/com/blankj/easy/_0101/Solution.java diff --git a/src/com/blankj/easy/_104/Solution.java b/src/com/blankj/easy/_0104/Solution.java similarity index 100% rename from src/com/blankj/easy/_104/Solution.java rename to src/com/blankj/easy/_0104/Solution.java diff --git a/src/com/blankj/easy/_107/Solution.java b/src/com/blankj/easy/_0107/Solution.java similarity index 100% rename from src/com/blankj/easy/_107/Solution.java rename to src/com/blankj/easy/_0107/Solution.java diff --git a/src/com/blankj/easy/_108/Solution.java b/src/com/blankj/easy/_0108/Solution.java similarity index 100% rename from src/com/blankj/easy/_108/Solution.java rename to src/com/blankj/easy/_0108/Solution.java diff --git a/src/com/blankj/easy/_110/Solution.java b/src/com/blankj/easy/_0110/Solution.java similarity index 100% rename from src/com/blankj/easy/_110/Solution.java rename to src/com/blankj/easy/_0110/Solution.java diff --git a/src/com/blankj/easy/_111/Solution.java b/src/com/blankj/easy/_0111/Solution.java similarity index 100% rename from src/com/blankj/easy/_111/Solution.java rename to src/com/blankj/easy/_0111/Solution.java diff --git a/src/com/blankj/easy/_112/Solution.java b/src/com/blankj/easy/_0112/Solution.java similarity index 100% rename from src/com/blankj/easy/_112/Solution.java rename to src/com/blankj/easy/_0112/Solution.java diff --git a/src/com/blankj/easy/_118/Solution.java b/src/com/blankj/easy/_0118/Solution.java similarity index 100% rename from src/com/blankj/easy/_118/Solution.java rename to src/com/blankj/easy/_0118/Solution.java diff --git a/src/com/blankj/easy/_119/Solution.java b/src/com/blankj/easy/_0119/Solution.java similarity index 100% rename from src/com/blankj/easy/_119/Solution.java rename to src/com/blankj/easy/_0119/Solution.java diff --git a/src/com/blankj/easy/_121/Solution.java b/src/com/blankj/easy/_0121/Solution.java similarity index 100% rename from src/com/blankj/easy/_121/Solution.java rename to src/com/blankj/easy/_0121/Solution.java diff --git a/src/com/blankj/easy/_122/Solution.java b/src/com/blankj/easy/_0122/Solution.java similarity index 100% rename from src/com/blankj/easy/_122/Solution.java rename to src/com/blankj/easy/_0122/Solution.java diff --git a/src/com/blankj/easy/_543/Solution.java b/src/com/blankj/easy/_0543/Solution.java similarity index 100% rename from src/com/blankj/easy/_543/Solution.java rename to src/com/blankj/easy/_0543/Solution.java diff --git a/src/com/blankj/hard/_004/Solution.java b/src/com/blankj/hard/_0004/Solution.java similarity index 100% rename from src/com/blankj/hard/_004/Solution.java rename to src/com/blankj/hard/_0004/Solution.java diff --git a/src/com/blankj/hard/_010/Solution.java b/src/com/blankj/hard/_0010/Solution.java similarity index 100% rename from src/com/blankj/hard/_010/Solution.java rename to src/com/blankj/hard/_0010/Solution.java diff --git a/src/com/blankj/hard/_023/Solution.java b/src/com/blankj/hard/_0023/Solution.java similarity index 100% rename from src/com/blankj/hard/_023/Solution.java rename to src/com/blankj/hard/_0023/Solution.java diff --git a/src/com/blankj/hard/_025/Solution.java b/src/com/blankj/hard/_0025/Solution.java similarity index 100% rename from src/com/blankj/hard/_025/Solution.java rename to src/com/blankj/hard/_0025/Solution.java diff --git a/src/com/blankj/hard/_030/Solution.java b/src/com/blankj/hard/_0030/Solution.java similarity index 100% rename from src/com/blankj/hard/_030/Solution.java rename to src/com/blankj/hard/_0030/Solution.java diff --git a/src/com/blankj/hard/_044/Solution.java b/src/com/blankj/hard/_0044/Solution.java similarity index 100% rename from src/com/blankj/hard/_044/Solution.java rename to src/com/blankj/hard/_0044/Solution.java diff --git a/src/com/blankj/hard/_068/Solution.java b/src/com/blankj/hard/_0068/Solution.java similarity index 100% rename from src/com/blankj/hard/_068/Solution.java rename to src/com/blankj/hard/_0068/Solution.java diff --git a/src/com/blankj/hard/_1028/Solution.java b/src/com/blankj/hard/_1028/Solution.java new file mode 100644 index 00000000..6089220f --- /dev/null +++ b/src/com/blankj/hard/_1028/Solution.java @@ -0,0 +1,80 @@ +package com.blankj.hard._1028; + +import com.blankj.structure.TreeNode; + +import java.util.LinkedList; + +/** + *
+ *     author: Blankj
+ *     blog  : http://blankj.com
+ *     time  : 2020/06/19
+ *     desc  :
+ * 
+ */ +public class Solution { + + public TreeNode recoverFromPreorder(String S) { + char[] chars = S.toCharArray(); + int len = chars.length; + LinkedList stack = new LinkedList<>(); + for (int i = 0; i < len; ) { + int level = 0, val = 0; + while (chars[i] == '-') { // 获取所在层级,Character.isDigit() 会比较慢 + ++i; + ++level; + } + while (i < len && chars[i] != '-') { // 获取节点的值 + val = val * 10 + chars[i++] - '0'; + } + TreeNode curNode = new TreeNode(val); + while (stack.size() > level) { // 栈顶不是父亲,栈顶出栈 + stack.removeLast(); + } + if (level > 0) { + TreeNode parent = stack.getLast(); + if (parent.left == null) { // 如果节点只有一个子节点,那么保证该子节点为左子节点。 + parent.left = curNode; + } else { + parent.right = curNode; + } + } + stack.addLast(curNode); + } + return stack.get(0); + } + +// public TreeNode recoverFromPreorder(String S) { +// char[] chars = S.toCharArray(); +// int len = chars.length; +// List levels = new LinkedList<>(); +// for (int i = 0; i < len; ) { +// int level = 0, val = 0; +// while (chars[i] == '-') { // 获取所在层级,Character.isDigit() 会比较慢 +// ++i; +// ++level; +// } +// while (i < len && chars[i] != '-') { // 获取节点的值 +// val = val * 10 + chars[i++] - '0'; +// } +// TreeNode curNode = new TreeNode(val); +// if (level > 0) { +// TreeNode parent = levels.get(level - 1); +// if (parent.left == null) { // 如果节点只有一个子节点,那么保证该子节点为左子节点。 +// parent.left = curNode; +// } else { +// parent.right = curNode; +// } +// } +// levels.add(level, curNode); // 因为是前序遍历(根-左-右),也就是右覆盖左时,此时左树已遍历完成,故无需考虑覆盖问题 +// } +// return levels.get(0); +// } + + public static void main(String[] args) { + Solution solution = new Solution(); + TreeNode.print(solution.recoverFromPreorder("1-2--3--4-5--6--7")); + System.out.println("=============================================="); + TreeNode.print(solution.recoverFromPreorder("1-2--3---4-5--6---7")); + } +} diff --git a/src/com/blankj/medium/_002/Solution.java b/src/com/blankj/medium/_0002/Solution.java similarity index 100% rename from src/com/blankj/medium/_002/Solution.java rename to src/com/blankj/medium/_0002/Solution.java diff --git a/src/com/blankj/medium/_003/Solution.java b/src/com/blankj/medium/_0003/Solution.java similarity index 100% rename from src/com/blankj/medium/_003/Solution.java rename to src/com/blankj/medium/_0003/Solution.java diff --git a/src/com/blankj/medium/_005/Solution.java b/src/com/blankj/medium/_0005/Solution.java similarity index 100% rename from src/com/blankj/medium/_005/Solution.java rename to src/com/blankj/medium/_0005/Solution.java diff --git a/src/com/blankj/medium/_006/Solution.java b/src/com/blankj/medium/_0006/Solution.java similarity index 100% rename from src/com/blankj/medium/_006/Solution.java rename to src/com/blankj/medium/_0006/Solution.java diff --git a/src/com/blankj/medium/_008/Solution.java b/src/com/blankj/medium/_0008/Solution.java similarity index 100% rename from src/com/blankj/medium/_008/Solution.java rename to src/com/blankj/medium/_0008/Solution.java diff --git a/src/com/blankj/medium/_011/Solution.java b/src/com/blankj/medium/_0011/Solution.java similarity index 100% rename from src/com/blankj/medium/_011/Solution.java rename to src/com/blankj/medium/_0011/Solution.java diff --git a/src/com/blankj/medium/_012/Solution.java b/src/com/blankj/medium/_0012/Solution.java similarity index 100% rename from src/com/blankj/medium/_012/Solution.java rename to src/com/blankj/medium/_0012/Solution.java diff --git a/src/com/blankj/medium/_015/Solution.java b/src/com/blankj/medium/_0015/Solution.java similarity index 100% rename from src/com/blankj/medium/_015/Solution.java rename to src/com/blankj/medium/_0015/Solution.java diff --git a/src/com/blankj/medium/_016/Solution.java b/src/com/blankj/medium/_0016/Solution.java similarity index 100% rename from src/com/blankj/medium/_016/Solution.java rename to src/com/blankj/medium/_0016/Solution.java diff --git a/src/com/blankj/medium/_017/Solution.java b/src/com/blankj/medium/_0017/Solution.java similarity index 100% rename from src/com/blankj/medium/_017/Solution.java rename to src/com/blankj/medium/_0017/Solution.java diff --git a/src/com/blankj/medium/_018/Solution.java b/src/com/blankj/medium/_0018/Solution.java similarity index 100% rename from src/com/blankj/medium/_018/Solution.java rename to src/com/blankj/medium/_0018/Solution.java diff --git a/src/com/blankj/medium/_019/Solution.java b/src/com/blankj/medium/_0019/Solution.java similarity index 100% rename from src/com/blankj/medium/_019/Solution.java rename to src/com/blankj/medium/_0019/Solution.java diff --git a/src/com/blankj/medium/_022/Solution.java b/src/com/blankj/medium/_0022/Solution.java similarity index 100% rename from src/com/blankj/medium/_022/Solution.java rename to src/com/blankj/medium/_0022/Solution.java diff --git a/src/com/blankj/medium/_024/Solution.java b/src/com/blankj/medium/_0024/Solution.java similarity index 100% rename from src/com/blankj/medium/_024/Solution.java rename to src/com/blankj/medium/_0024/Solution.java diff --git a/src/com/blankj/medium/_029/Solution.java b/src/com/blankj/medium/_0029/Solution.java similarity index 100% rename from src/com/blankj/medium/_029/Solution.java rename to src/com/blankj/medium/_0029/Solution.java diff --git a/src/com/blankj/medium/_033/Solution.java b/src/com/blankj/medium/_0033/Solution.java similarity index 100% rename from src/com/blankj/medium/_033/Solution.java rename to src/com/blankj/medium/_0033/Solution.java diff --git a/src/com/blankj/medium/_043/Solution.java b/src/com/blankj/medium/_0043/Solution.java similarity index 100% rename from src/com/blankj/medium/_043/Solution.java rename to src/com/blankj/medium/_0043/Solution.java diff --git a/src/com/blankj/medium/_049/Solution.java b/src/com/blankj/medium/_0049/Solution.java similarity index 100% rename from src/com/blankj/medium/_049/Solution.java rename to src/com/blankj/medium/_0049/Solution.java diff --git a/src/com/blankj/medium/_050/Solution.java b/src/com/blankj/medium/_0050/Solution.java similarity index 100% rename from src/com/blankj/medium/_050/Solution.java rename to src/com/blankj/medium/_0050/Solution.java diff --git a/src/com/blankj/medium/_056/Solution.java b/src/com/blankj/medium/_0056/Solution.java similarity index 100% rename from src/com/blankj/medium/_056/Solution.java rename to src/com/blankj/medium/_0056/Solution.java diff --git a/src/com/blankj/medium/_057/Solution.java b/src/com/blankj/medium/_0057/Solution.java similarity index 100% rename from src/com/blankj/medium/_057/Solution.java rename to src/com/blankj/medium/_0057/Solution.java diff --git a/src/com/blankj/medium/_554/Solution.java b/src/com/blankj/medium/_0554/Solution.java similarity index 100% rename from src/com/blankj/medium/_554/Solution.java rename to src/com/blankj/medium/_0554/Solution.java From 845a0df2cf9b4d77aad84771df4a058b97445fe6 Mon Sep 17 00:00:00 2001 From: Blankj Date: Mon, 6 Jul 2020 13:32:03 +0800 Subject: [PATCH 3/6] add 0209 --- README.md | 7 +- note/0209/README.md | 116 +++++++++++++--------- note/1014/README.md | 1 - src/com/blankj/hard/_1028/Solution.java | 53 +++++----- src/com/blankj/medium/_0209/Solution.java | 70 +++++++++++++ 5 files changed, 172 insertions(+), 75 deletions(-) create mode 100644 src/com/blankj/medium/_0209/Solution.java diff --git a/README.md b/README.md index b47c19ac..d3d2aaff 100644 --- a/README.md +++ b/README.md @@ -85,7 +85,8 @@ | 49 | [Group Anagrams][0049] | Hash Table, String | | 50 | [Pow(x, n)][0050] | Math, Binary Search | | 56 | [Merge Intervals][0056] | Array, Sort | -| 209 | [长度最小的子数组(Minimum Size Subarray Sum)][0209] | Array, Sort | +| 209 | [长度最小的子数组(Minimum Size Subarray Sum)][0209] | 数组、双指针、二分查找 | +| 215 | [数组中的第K个最大元素(Kth Largest Element in an Array)][0215] | 堆、分治算法 | | 554 | [Brick Wall][0554] | Hash Table | | 1014 | [最佳观光组合(Best Sightseeing Pair)][1014] | 数组 | @@ -168,11 +169,13 @@ [0049]: https://github.com/Blankj/awesome-java-leetcode/blob/master/note/0049/README.md [0050]: https://github.com/Blankj/awesome-java-leetcode/blob/master/note/0050/README.md [0056]: https://github.com/Blankj/awesome-java-leetcode/blob/master/note/0056/README.md +[0209]: https://github.com/Blankj/awesome-java-leetcode/blob/master/note/0209/README.md +[0215]: https://github.com/Blankj/awesome-java-leetcode/blob/master/note/0215/README.md [0554]: https://github.com/Blankj/awesome-java-leetcode/blob/master/note/0554/README.md [1014]: https://github.com/Blankj/awesome-java-leetcode/blob/master/note/1014/README.md + [0004]: https://github.com/Blankj/awesome-java-leetcode/blob/master/note/0004/README.md [0010]: https://github.com/Blankj/awesome-java-leetcode/blob/master/note/0010/README.md - [0023]: https://github.com/Blankj/awesome-java-leetcode/blob/master/note/0023/README.md [0025]: https://github.com/Blankj/awesome-java-leetcode/blob/master/note/0025/README.md [0030]: https://github.com/Blankj/awesome-java-leetcode/blob/master/note/0030/README.md diff --git a/note/0209/README.md b/note/0209/README.md index 4c7dedcd..e0984de9 100644 --- a/note/0209/README.md +++ b/note/0209/README.md @@ -2,80 +2,106 @@ ## 题目描述 -我们从二叉树的根节点 `root` 开始进行深度优先搜索。 +给定一个含有 **n** 个正整数的数组和一个正整数 **s** ,找出该数组中满足其和 **≥ s** 的长度最小的连续子数组,并返回其长度。如果不存在符合条件的连续子数组,返回 0。 -在遍历中的每个节点处,我们输出 `D` 条短划线(其中 `D` 是该节点的深度),然后输出该节点的值。(_如果节点的深度为 `D`,则其直接子节点的深度为 `D + 1`。根节点的深度为 `0`)。_ - -如果节点只有一个子节点,那么保证该子节点为左子节点。 - -给出遍历输出 `S`,还原树并返回其根节点 `root`。 - -**示例 1:** - -**![](https://assets.leetcode-cn.com/aliyun-lc-upload/uploads/2019/04/12/recover-a-tree-from-preorder-traversal.png)** +**示例:** ``` -输入:"1-2--3--4-5--6--7" -输出:[1,2,5,3,4,6,7] +输入:s = 7, nums = [2,3,1,2,4,3] +输出:2 +解释:子数组 [4,3] 是该条件下的长度最小的连续子数组。 ``` -**示例 2:** +**进阶:** -**![](https://assets.leetcode-cn.com/aliyun-lc-upload/uploads/2019/04/12/screen-shot-2019-04-10-at-114101-pm.png)** +* 如果你已经完成了 _O_(_n_) 时间复杂度的解法, 请尝试 _O_(_n_ log _n_) 时间复杂度的解法。 -``` -输入:"1-2--3---4-5--6---7" -输出:[1,2,5,3,null,6,null,4,null,7] -``` +**标签:** 数组、双指针、二分查找 -**示例 3:** -![](https://assets.leetcode-cn.com/aliyun-lc-upload/uploads/2019/04/12/screen-shot-2019-04-10-at-114955-pm.png) +## 思路 0 -``` -输入:"1-401--349---90--88" -输出:[1,401,null,349,88,90] +直接暴力法,两重 for 循环,记录最小长度即可,代码很简单,如下所示: + + +```java +class Solution { + public int minSubArrayLen(int s, int[] nums) { + int ans = Integer.MAX_VALUE; + for (int i = 0; i < nums.length; i++) { + int sum = nums[i]; + if (sum >= s) { + return 1; + } + for (int j = i + 1; j < nums.length; j++) { + sum += nums[j]; + if (sum >= s) { + ans = Math.min(ans, j - i + 1); + break; + } + } + } + return ans == Integer.MAX_VALUE ? 0 : ans; + } +} ``` -**提示:** +## 思路 1 -* 原始树中的节点数介于 `1` 和 `1000` 之间。 -* 每个节点的值介于 `1` 和 `10 ^ 9` 之间。 +对上面进行优化,我们通过首位两个指针来模拟滑动窗口,如果加起来值小于 s,则向右扩大窗口直至不小于 s,然后固定窗口右侧来向左缩小窗口,同时更新符合条件的最小窗口长度即可,代码如下所示: -**标签:** 树、深度优先搜索 +```java +class Solution { + public int minSubArrayLen(int s, int[] nums) { + int left = 0, right = 0, sum = 0, ans = Integer.MAX_VALUE; + while (right < nums.length) { + sum += nums[right++]; // 向右扩大窗口 + while (sum >= s) { // 如果不小于 s,则收缩窗口左边界 + ans = Math.min(ans, right - left);// 更新结果 + sum -= nums[left++]; // 向左缩小窗口 + } + } + return ans == Integer.MAX_VALUE ? 0 : ans; + } +} +``` +## 思路 2 -## 思路 +进阶中说了,尝试使用 O(nlogn) 时间复杂度的解法,由于数组都是正整数构成,所以前缀和一定是递增的,想到的应该就是用二分查找了,可以用 sums 数组来存储 nums 数组的前缀和,sums[i] 代表 nums[0] 到 nums[i - 1] 总和,然后遍历 sums 数组,对 sums[i] + s 进行二分查找然后不断更新结果即可,具体代码如下所示: -直接暴力两层 for 循环肯定过不了关,我们把公式变化为 `(A[i] + i) + (A[j] - j)`,看到此应该就可以想到在每次遍历 `j` 时,只需要知道 `max(A[i] + i)` 即可。 ```java class Solution { - - public int maxScoreSightseeingPair(int[] A) { - int ans = 0, cur = A[0] + 0; - for (int j = 1; j < A.length; j++) { - ans = Math.max(ans, cur + A[j] - j); // 计算当前最大得分 - cur = Math.max(cur, A[j] + j); // 更新最大的 A[i] + i + public int minSubArrayLen(int s, int[] nums) { + int ans = Integer.MAX_VALUE; + int[] sums = new int[nums.length + 1]; + for (int i = 0; i < nums.length; i++) { + sums[i + 1] = sums[i] + nums[i]; } - return ans; - } - - public static void main(String[] args) { - Solution solution = new Solution(); - int[] A = new int[]{8, 1, 5, 2, 6}; - System.out.println(solution.maxScoreSightseeingPair(A)); + for (int i = 0; i < nums.length; i++) { + int target = s + sums[i]; // 确定要搜索的目标值 + // Java 二分查找 Arrays.binarySearch 如果找到就会返回该元素的索引; + // 如果没找到就会返回一个负数,这个负数取反之后再减一就是查找的值应该在数组中的位置; + // 例如 [-1, 0, 1, 5] 中二分查找 2,其返回值就是 -4,其 -(-4) - 1 = 3,所以 2 这个元素插入到数组的索引就是 3 + int bound = Arrays.binarySearch(sums, target); + if (bound < 0) { + bound = -bound - 1; + } + if (bound < sums.length) { // 当 bound 确定插入点不在 sums 数组的最后面时,说明不小于 target 的值了 + ans = Math.min(ans, bound - i); + } + } + return ans == Integer.MAX_VALUE ? 0 : ans; } } - ``` - ## 结语 如果你同我一样热爱数据结构、算法、LeetCode,可以关注我 GitHub 上的 LeetCode 题解:[awesome-java-leetcode][ajl] -[title]: https://leetcode-cn.com/problems/recover-a-tree-from-preorder-traversal +[title]: https://leetcode-cn.com/problems/minimum-size-subarray-sum [ajl]: https://github.com/Blankj/awesome-java-leetcode diff --git a/note/1014/README.md b/note/1014/README.md index 34357d6c..fe4a965e 100644 --- a/note/1014/README.md +++ b/note/1014/README.md @@ -46,7 +46,6 @@ class Solution { System.out.println(solution.maxScoreSightseeingPair(A)); } } - ``` diff --git a/src/com/blankj/hard/_1028/Solution.java b/src/com/blankj/hard/_1028/Solution.java index 6089220f..da93396b 100644 --- a/src/com/blankj/hard/_1028/Solution.java +++ b/src/com/blankj/hard/_1028/Solution.java @@ -13,6 +13,32 @@ * */ public class Solution { +// public TreeNode recoverFromPreorder(String S) { +// char[] chars = S.toCharArray(); +// int len = chars.length; +// List levels = new LinkedList<>(); +// for (int i = 0; i < len; ) { +// int level = 0, val = 0; +// while (chars[i] == '-') { // 获取所在层级,Character.isDigit() 会比较慢 +// ++i; +// ++level; +// } +// while (i < len && chars[i] != '-') { // 获取节点的值 +// val = val * 10 + chars[i++] - '0'; +// } +// TreeNode curNode = new TreeNode(val); +// if (level > 0) { +// TreeNode parent = levels.get(level - 1); +// if (parent.left == null) { // 如果节点只有一个子节点,那么保证该子节点为左子节点。 +// parent.left = curNode; +// } else { +// parent.right = curNode; +// } +// } +// levels.add(level, curNode); // 因为是前序遍历(根-左-右),也就是右覆盖左时,此时左树已遍历完成,故无需考虑覆盖问题 +// } +// return levels.get(0); +// } public TreeNode recoverFromPreorder(String S) { char[] chars = S.toCharArray(); @@ -44,33 +70,6 @@ public TreeNode recoverFromPreorder(String S) { return stack.get(0); } -// public TreeNode recoverFromPreorder(String S) { -// char[] chars = S.toCharArray(); -// int len = chars.length; -// List levels = new LinkedList<>(); -// for (int i = 0; i < len; ) { -// int level = 0, val = 0; -// while (chars[i] == '-') { // 获取所在层级,Character.isDigit() 会比较慢 -// ++i; -// ++level; -// } -// while (i < len && chars[i] != '-') { // 获取节点的值 -// val = val * 10 + chars[i++] - '0'; -// } -// TreeNode curNode = new TreeNode(val); -// if (level > 0) { -// TreeNode parent = levels.get(level - 1); -// if (parent.left == null) { // 如果节点只有一个子节点,那么保证该子节点为左子节点。 -// parent.left = curNode; -// } else { -// parent.right = curNode; -// } -// } -// levels.add(level, curNode); // 因为是前序遍历(根-左-右),也就是右覆盖左时,此时左树已遍历完成,故无需考虑覆盖问题 -// } -// return levels.get(0); -// } - public static void main(String[] args) { Solution solution = new Solution(); TreeNode.print(solution.recoverFromPreorder("1-2--3--4-5--6--7")); diff --git a/src/com/blankj/medium/_0209/Solution.java b/src/com/blankj/medium/_0209/Solution.java new file mode 100644 index 00000000..cdfedebc --- /dev/null +++ b/src/com/blankj/medium/_0209/Solution.java @@ -0,0 +1,70 @@ +package com.blankj.medium._0209; + +import java.util.Arrays; + +/** + *
+ *     author: Blankj
+ *     blog  : http://blankj.com
+ *     time  : 2020/06/30
+ *     desc  :
+ * 
+ */ +public class Solution { +// public int minSubArrayLen(int s, int[] nums) { +// int ans = Integer.MAX_VALUE; +// for (int i = 0; i < nums.length; i++) { +// int sum = nums[i]; +// if (sum >= s) { +// return 1; +// } +// for (int j = i + 1; j < nums.length; j++) { +// sum += nums[j]; +// if (sum >= s) { +// ans = Math.min(ans, j - i + 1); +// break; +// } +// } +// } +// return ans == Integer.MAX_VALUE ? 0 : ans; +// } + +// public int minSubArrayLen(int s, int[] nums) { +// int left = 0, right = 0, sum = 0, ans = Integer.MAX_VALUE; +// while (right < nums.length) { +// sum += nums[right++]; // 向右扩大窗口 +// while (sum >= s) { // 如果不小于 s,则收缩窗口左边界 +// ans = Math.min(ans, right - left);// 更新结果 +// sum -= nums[left++]; // 向左缩小窗口 +// } +// } +// return ans == Integer.MAX_VALUE ? 0 : ans; +// } + + public int minSubArrayLen(int s, int[] nums) { + int ans = Integer.MAX_VALUE; + int[] sums = new int[nums.length + 1]; + for (int i = 0; i < nums.length; i++) { + sums[i + 1] = sums[i] + nums[i]; + } + for (int i = 0; i < nums.length; i++) { + int target = s + sums[i]; // 确定要搜索的目标值 + // Java 二分查找 Arrays.binarySearch 如果找到就会返回该元素的索引; + // 如果没找到就会返回一个负数,这个负数取反之后再减一就是查找的值应该在数组中的位置; + // 例如 [-1, 0, 1, 5] 中二分查找 2,其返回值就是 -4,其 -(-4) - 1 = 3,所以 2 这个元素插入到数组的索引就是 3 + int bound = Arrays.binarySearch(sums, target); + if (bound < 0) { + bound = -bound - 1; + } + if (bound < sums.length) { // 当 bound 确定插入点不在 sums 数组的最后面时,说明不小于 target 的值了 + ans = Math.min(ans, bound - i); + } + } + return ans == Integer.MAX_VALUE ? 0 : ans; + } + + public static void main(String[] args) { + Solution solution = new Solution(); + System.out.println(solution.minSubArrayLen(7, new int[]{2, 3, 1, 2, 4, 3})); + } +} \ No newline at end of file From 81ed96d217df7ab6a2be481f2013db12dacf179b Mon Sep 17 00:00:00 2001 From: Blankj Date: Tue, 7 Jul 2020 19:25:03 +0800 Subject: [PATCH 4/6] add 0063 --- README.md | 2 + note/0063/README.md | 86 +++++++++++++++++++ .../{medium => hard}/_0057/Solution.java | 2 +- src/com/blankj/medium/_0067/Solution.java | 40 +++++++++ 4 files changed, 129 insertions(+), 1 deletion(-) create mode 100644 note/0063/README.md rename src/com/blankj/{medium => hard}/_0057/Solution.java (97%) create mode 100644 src/com/blankj/medium/_0067/Solution.java diff --git a/README.md b/README.md index d3d2aaff..2bff41d9 100644 --- a/README.md +++ b/README.md @@ -85,6 +85,7 @@ | 49 | [Group Anagrams][0049] | Hash Table, String | | 50 | [Pow(x, n)][0050] | Math, Binary Search | | 56 | [Merge Intervals][0056] | Array, Sort | +| 63 | [不同路径 II(Unique Paths II)][0063] | 数组、动态规划 | | 209 | [长度最小的子数组(Minimum Size Subarray Sum)][0209] | 数组、双指针、二分查找 | | 215 | [数组中的第K个最大元素(Kth Largest Element in an Array)][0215] | 堆、分治算法 | | 554 | [Brick Wall][0554] | Hash Table | @@ -169,6 +170,7 @@ [0049]: https://github.com/Blankj/awesome-java-leetcode/blob/master/note/0049/README.md [0050]: https://github.com/Blankj/awesome-java-leetcode/blob/master/note/0050/README.md [0056]: https://github.com/Blankj/awesome-java-leetcode/blob/master/note/0056/README.md +[0063]: https://github.com/Blankj/awesome-java-leetcode/blob/master/note/0063/README.md [0209]: https://github.com/Blankj/awesome-java-leetcode/blob/master/note/0209/README.md [0215]: https://github.com/Blankj/awesome-java-leetcode/blob/master/note/0215/README.md [0554]: https://github.com/Blankj/awesome-java-leetcode/blob/master/note/0554/README.md diff --git a/note/0063/README.md b/note/0063/README.md new file mode 100644 index 00000000..2905be6f --- /dev/null +++ b/note/0063/README.md @@ -0,0 +1,86 @@ +# [不同路径 II(Unique Paths II)][title] + +## 题目描述 + +一个机器人位于一个 _m x n_ 网格的左上角 (起始点在下图中标记为“Start” )。 + +机器人每次只能向下或者向右移动一步。机器人试图达到网格的右下角(在下图中标记为“Finish”)。 + +现在考虑网格中有障碍物。那么从左上角到右下角将会有多少条不同的路径? + +![](https://assets.leetcode-cn.com/aliyun-lc-upload/uploads/2018/10/22/robot_maze.png) + +网格中的障碍物和空位置分别用 `1` 和 `0` 来表示。 + +**说明:**_m_ 和 _n_ 的值均不超过 100。 + +**示例 1:** +``` +输入: +[ +  [0,0,0], +  [0,1,0], +  [0,0,0] +] +输出: 2 +解释: +3x3 网格的正中间有一个障碍物。 +从左上角到右下角一共有 2 条不同的路径: +1. 向右 -> 向右 -> 向下 -> 向下 +2. 向下 -> 向下 -> 向右 -> 向右 +``` + +**标签:** 数组、动态规划 + + +## 思路 + +做过爬楼梯的应该很快就能想到这是一道很典型的动态规划题目, + +我们令 `dp[i][j]` 表示走到格子 `(i, j)` 的路径数, + +那么当 `(i, j)` 没障碍物时,`dp[i][j] = 0`; + +那么当 `(i, j)` 有障碍物时,`dp[i][j] = dp[i - 1][j] + dp[i][j - 1]`; + +其初始态第 1 列(行)的格子只有从其上(左)边格子走过去这一种走法,因此初始化 `dp[i][0]`(`dp[0][j]`)值为 1,且遇到障碍物时后面值都为 0; + +有了这些条件,我相信你肯定可以写出代码来了,具体如下所示: + + +```java +class Solution { + public int uniquePathsWithObstacles(int[][] obstacleGrid) { + int m = obstacleGrid.length, n = obstacleGrid[0].length; + int[][] dp = new int[m][n]; + // 其初始态第 1 列(行)的格子只有从其上(左)边格子走过去这一种走法, + // 因此初始化 dp[i][0](dp[0][j])值为 1,且遇到障碍物时后面值都为 0; + for (int i = 0; i < m && obstacleGrid[i][0] == 0; i++) { + dp[i][0] = 1; + } + for (int j = 0; j < n && obstacleGrid[0][j] == 0; j++) { + dp[0][j] = 1; + } + + for (int i = 1; i < m; i++) { + for (int j = 1; j < n; j++) { + if (obstacleGrid[i][j] == 0) { + // 当 (i, j) 有障碍物时,dp[i][j] = dp[i - 1][j] + dp[i][j - 1]; + dp[i][j] = dp[i - 1][j] + dp[i][j - 1]; + } + } + } + return dp[m - 1][n - 1]; + } +} +``` + + +## 结语 + +如果你同我一样热爱数据结构、算法、LeetCode,可以关注我 GitHub 上的 LeetCode 题解:[awesome-java-leetcode][ajl] + + + +[title]: https://leetcode-cn.com/problems/unique-paths-ii +[ajl]: https://github.com/Blankj/awesome-java-leetcode diff --git a/src/com/blankj/medium/_0057/Solution.java b/src/com/blankj/hard/_0057/Solution.java similarity index 97% rename from src/com/blankj/medium/_0057/Solution.java rename to src/com/blankj/hard/_0057/Solution.java index 8fde4e3a..1e5b4cea 100644 --- a/src/com/blankj/medium/_0057/Solution.java +++ b/src/com/blankj/hard/_0057/Solution.java @@ -1,4 +1,4 @@ -package com.blankj.medium._057; +package com.blankj.hard._0057; import com.blankj.structure.Interval; diff --git a/src/com/blankj/medium/_0067/Solution.java b/src/com/blankj/medium/_0067/Solution.java new file mode 100644 index 00000000..aba07bad --- /dev/null +++ b/src/com/blankj/medium/_0067/Solution.java @@ -0,0 +1,40 @@ +package com.blankj.medium._0067; + +/** + *
+ *     author: Blankj
+ *     blog  : http://blankj.com
+ *     time  : 2020/07/07
+ *     desc  :
+ * 
+ */ +public class Solution { + public int uniquePathsWithObstacles(int[][] obstacleGrid) { + int m = obstacleGrid.length, n = obstacleGrid[0].length; + int[][] dp = new int[m][n]; + // 其初始态第 1 列(行)的格子只有从其上(左)边格子走过去这一种走法, + // 因此初始化 dp[i][0](dp[0][j])值为 1,且遇到障碍物时后面值都为 0; + for (int i = 0; i < m && obstacleGrid[i][0] == 0; i++) { + dp[i][0] = 1; + } + for (int j = 0; j < n && obstacleGrid[0][j] == 0; j++) { + dp[0][j] = 1; + } + + for (int i = 1; i < m; i++) { + for (int j = 1; j < n; j++) { + if (obstacleGrid[i][j] == 0) { + // 当 (i, j) 有障碍物时,dp[i][j] = dp[i - 1][j] + dp[i][j - 1]; + dp[i][j] = dp[i - 1][j] + dp[i][j - 1]; + } + } + } + return dp[m - 1][n - 1]; + } + + public static void main(String[] args) { + Solution solution = new Solution(); + int[][] obstacleGrid = {{0, 0, 0}, {0, 1, 0}, {0, 0, 0}}; + System.out.println(solution.uniquePathsWithObstacles(obstacleGrid)); + } +} From c781c4987cfe8a9fdcebcd99d86e64a85b3770db Mon Sep 17 00:00:00 2001 From: Blankj Date: Wed, 8 Jul 2020 13:37:41 +0800 Subject: [PATCH 5/6] add 16_11 --- README.md | 2 + note/16_11/README.md | 68 ++++++++++++++++++++++++ src/com/blankj/easy/_16_11/Solution.java | 34 ++++++++++++ 3 files changed, 104 insertions(+) create mode 100644 note/16_11/README.md create mode 100644 src/com/blankj/easy/_16_11/Solution.java diff --git a/README.md b/README.md index 2bff41d9..3ca83443 100644 --- a/README.md +++ b/README.md @@ -32,6 +32,7 @@ | 9 | [Palindrome Number][0009] | Math | | 13 | [Roman to Integer][0013] | Math, String | | 14 | [Longest Common Prefix][0014] | String | +| 16.11| [跳水板(Diving Board LCCI)][16_11] | 递归、记忆化 | | 20 | [Valid Parentheses][0020] | Stack, String | | 21 | [Merge Two Sorted Lists][0021] | Linked List | | 26 | [Remove Duplicates from Sorted Array][0026] | Array, Two Pointers | @@ -121,6 +122,7 @@ [0009]: https://github.com/Blankj/awesome-java-leetcode/blob/master/note/0009/README.md [0013]: https://github.com/Blankj/awesome-java-leetcode/blob/master/note/0013/README.md [0014]: https://github.com/Blankj/awesome-java-leetcode/blob/master/note/0014/README.md +[16_11]: https://github.com/Blankj/awesome-java-leetcode/blob/master/note/16_11/README.md [0020]: https://github.com/Blankj/awesome-java-leetcode/blob/master/note/0020/README.md [0021]: https://github.com/Blankj/awesome-java-leetcode/blob/master/note/0021/README.md [0026]: https://github.com/Blankj/awesome-java-leetcode/blob/master/note/0026/README.md diff --git a/note/16_11/README.md b/note/16_11/README.md new file mode 100644 index 00000000..13e6d104 --- /dev/null +++ b/note/16_11/README.md @@ -0,0 +1,68 @@ +# [跳水板(Diving Board LCCI)][title] + +## 题目描述 + +你正在使用一堆木板建造跳水板。有两种类型的木板,其中长度较短的木板长度为`shorter`,长度较长的木板长度为`longer`。你必须正好使用`k`块木板。编写一个方法,生成跳水板所有可能的长度。 + +返回的长度需要从小到大排列。 + +**示例:** + +``` +输入: +shorter = 1 +longer = 2 +k = 3 +输出: {3,4,5,6} +``` + +**提示:** + +* 0 < shorter <= longer +* 0 <= k <= 100000 + +**标签:** 递归、记忆化 + + +## 思路 + +这题乍一看,好像得用递归或动态规划来解,仔细一想,其实就是高中数学学过的等差数列知识。 + +当 `k == 0` 时,返回 `[]` 即可; + +当 `shorter == longer` 时,返回 `[k * shorter]` 即可; + +当 `shorter != longer` 时,那么其实就是一个首项为 `k * shorter`,末项为 `k * longer`,公差为 `longer - shorter` 的等差数列么; + +我们根据以上情况就可以写出如下代码了: + + +```java +public class Solution { + public int[] divingBoard(int shorter, int longer, int k) { + if (k == 0) { + return new int[0]; + } + if (shorter == longer) { + return new int[]{shorter * k}; + } + int[] ans = new int[k + 1]; + int st = k * shorter;// 等差数列的首项 + int delta = longer - shorter;// 公差 + for (int i = 0; i <= k; i++) { + ans[i] = st + i * delta; + } + return ans; + } +} +``` + + +## 结语 + +如果你同我一样热爱数据结构、算法、LeetCode,可以关注我 GitHub 上的 LeetCode 题解:[awesome-java-leetcode][ajl] + + + +[title]: https://leetcode-cn.com/problems/diving-board-lcci +[ajl]: https://github.com/Blankj/awesome-java-leetcode diff --git a/src/com/blankj/easy/_16_11/Solution.java b/src/com/blankj/easy/_16_11/Solution.java new file mode 100644 index 00000000..2e9e7906 --- /dev/null +++ b/src/com/blankj/easy/_16_11/Solution.java @@ -0,0 +1,34 @@ +package com.blankj.easy._16_11; + +import java.util.Arrays; + +/** + *
+ *     author: Blankj
+ *     blog  : http://blankj.com
+ *     time  : 2020/07/08
+ *     desc  :
+ * 
+ */ +public class Solution { + public int[] divingBoard(int shorter, int longer, int k) { + if (k == 0) { + return new int[0]; + } + if (shorter == longer) { + return new int[]{shorter * k}; + } + int[] ans = new int[k + 1]; + int st = k * shorter;// 等差数列的首项 + int delta = longer - shorter;// 公差 + for (int i = 0; i <= k; i++) { + ans[i] = st + i * delta; + } + return ans; + } + + public static void main(String[] args) { + Solution solution = new Solution(); + System.out.println(Arrays.toString(solution.divingBoard(1, 2, 3))); + } +} From 0d17728bfbe128132b21156dce19d4a5aa5001e9 Mon Sep 17 00:00:00 2001 From: Blankj Date: Thu, 10 Dec 2020 23:20:20 +0800 Subject: [PATCH 6/6] Update README.md --- README.md | 6 ++---- 1 file changed, 2 insertions(+), 4 deletions(-) diff --git a/README.md b/README.md index 3ca83443..7f7fa5da 100644 --- a/README.md +++ b/README.md @@ -108,9 +108,7 @@ ## 打个小广告 -欢迎加入我的知识星球「**[基你太美](https://t.zsxq.com/FmeqfYF)**」,我会在星球中分享 [AucFrame](https://blankj.com/2019/07/22/auc-frame/) 框架、大厂面经、[AndroidUtilCode](https://github.com/Blankj/AndroidUtilCode) 更详尽的说明...一切我所了解的知识,你可以通过支付进入我的星球「**[基你太美](https://t.zsxq.com/FmeqfYF)**」进行体验,加入后优先观看星球中精华的部分,如果觉得星球的内容对自身没有收益,你可以自行申请退款退出星球,也没必要加我好友;**如果你已确定要留在我的星球,可以通过扫描如下二维码(备注:基你太美+你的星球昵称)加我个人微信,方便我后续拉你进群(PS:进得越早价格越便宜)。** - -![我的二维码](https://raw.githubusercontent.com/Blankj/AndroidUtilCode/master/art/wechat.png) +欢迎加入我的小专栏「**[基你太美](https://xiaozhuanlan.com/Blankj)**」一起学习。 [src]: https://github.com/Blankj/awesome-java-leetcode/tree/master/src @@ -186,4 +184,4 @@ [0044]: https://github.com/Blankj/awesome-java-leetcode/blob/master/note/0044/README.md [0057]: https://github.com/Blankj/awesome-java-leetcode/blob/master/note/0057/README.md [0068]: https://github.com/Blankj/awesome-java-leetcode/blob/master/note/0068/README.md -[1028]: https://github.com/Blankj/awesome-java-leetcode/blob/master/note/1028/README.md \ No newline at end of file +[1028]: https://github.com/Blankj/awesome-java-leetcode/blob/master/note/1028/README.md