diff --git "a/Week_04/id_18/CountThePath\347\256\227\346\263\225\345\233\276.JPG" "b/Week_04/id_18/CountThePath\347\256\227\346\263\225\345\233\276.JPG" new file mode 100644 index 00000000..903b39bd Binary files /dev/null and "b/Week_04/id_18/CountThePath\347\256\227\346\263\225\345\233\276.JPG" differ diff --git a/Week_04/id_18/LeetCode_53_18.java b/Week_04/id_18/LeetCode_53_18.java index 7791b992..0c6ffc04 100644 --- a/Week_04/id_18/LeetCode_53_18.java +++ b/Week_04/id_18/LeetCode_53_18.java @@ -19,4 +19,29 @@ public int maxSubArray(int[] nums) { return result; } + + public int maxSubArray1(int[] nums) { + int result = nums[0]; + int sum = nums[0]; + for (int num: nums) { + sum = Math.max(num, sum + num); + result = Math.max(result, sum); + } + + return result; + } + + public int maxSubArray2(int[] nums) { + int n = nums.length; + int[] dp = new int[n]; + dp[0] = nums[0]; + int result = dp[0]; + + for (int i = 1; i < n; i++) { + dp[i] = nums[i] + (dp[i - 1] > 0 ? dp[i - 1] : 0); + result = Math.max(result, dp[i]); + } + + return result; + } } diff --git a/Week_04/id_18/NOTE.md b/Week_04/id_18/NOTE.md index d169ee72..636b428e 100644 --- a/Week_04/id_18/NOTE.md +++ b/Week_04/id_18/NOTE.md @@ -759,9 +759,55 @@ class Solution { } } ``` +#### 代码优化 +上述代码中,为了表示sum这个值是否对result有增益,所以做了条件判断。但是从另一个角度看,条件判断的过程就是判断当前元素加上sum值后是否有增益,如果没有,那么sum就需要重新初始化。所以只要比较当前元素和sum的大小,取大的就可以了。 +```java +class Solution { + public int maxSubArray(int[] nums) { + int result = nums[0]; + int sum = 0; + for (int num: nums) { + sum = Math.max(num, sum + num); + result = Math.max(result, sum); + } + + return result; + } +} +``` +时间和空间都没有明显优化,但是代码变的干净且更加易于理解了。 ### 解法二 #### 思路 +从题目可知,这是一个典型的求最优解的问题,所以可以通过动态规划来解决。解决DP问题可以通过找到求解子问题的格式来攻克,题目要求找到最大子序列,那么子问题的函数就可以有如下三个参数: +- 数组 +- 子序列的起始下标 +- 子序列的终止下标 +但是如上3个参数对于确定原始问题和子问题之间的关系会变得比较麻烦。再通过解法一中的解题过程可以了解到,如上的三个参数其实也可以通过**当前最优解 sum 或 这里的dp[i - 1]** + **当前元素 num 或 这里的nums[i]**来定义。这样原始问题和子问题的关系就可以通过如下的公式确定了: +``` +dp[i] = nums[i] + dp[i - 1] > 0 ? dp[i - 1] : 0 +``` +如上代码参考的是解法一的思路,判断**前一个子问题的解法是否对当前元素有增益**。这样整个代码过程和解法一很相似。 #### 代码 +```java +class Solution { + public int maxSubArray(int[] nums) { + int n = nums.length; + int[] dp = new int[n]; + dp[0] = nums[0]; + int result = dp[0]; + + for (int i = 1; i < n; i++) { + dp[i] = nums[i] + (dp[i - 1] > 0 ? dp[i - 1] : 0); + result = Math.max(result, dp[i]); + } + + return result; + } +} +``` +### 解法三 +#### 思路 +#### 代码 ### 收获 \ No newline at end of file diff --git a/Week_04/id_18/bfs.JPG b/Week_04/id_18/bfs.JPG new file mode 100644 index 00000000..9651188a Binary files /dev/null and b/Week_04/id_18/bfs.JPG differ diff --git a/Week_04/id_18/dfs.JPG b/Week_04/id_18/dfs.JPG new file mode 100644 index 00000000..672d3db4 Binary files /dev/null and b/Week_04/id_18/dfs.JPG differ diff --git "a/Week_04/id_18/fib\350\247\243\346\263\225\345\233\276.JPG" "b/Week_04/id_18/fib\350\247\243\346\263\225\345\233\276.JPG" new file mode 100644 index 00000000..7d564a90 Binary files /dev/null and "b/Week_04/id_18/fib\350\247\243\346\263\225\345\233\276.JPG" differ diff --git "a/Week_04/id_18/\346\240\221\347\232\204\345\256\232\344\271\211.jpg" "b/Week_04/id_18/\346\240\221\347\232\204\345\256\232\344\271\211.jpg" new file mode 100644 index 00000000..7c123ebb Binary files /dev/null and "b/Week_04/id_18/\346\240\221\347\232\204\345\256\232\344\271\211.jpg" differ diff --git "a/Week_04/id_18/\346\240\221\347\232\204\347\233\270\344\274\274\346\246\202\345\277\265\347\244\272\346\204\217\345\233\276.jpg" "b/Week_04/id_18/\346\240\221\347\232\204\347\233\270\344\274\274\346\246\202\345\277\265\347\244\272\346\204\217\345\233\276.jpg" new file mode 100644 index 00000000..767f1f24 Binary files /dev/null and "b/Week_04/id_18/\346\240\221\347\232\204\347\233\270\344\274\274\346\246\202\345\277\265\347\244\272\346\204\217\345\233\276.jpg" differ diff --git "a/Week_04/id_18/\347\256\227\346\263\225\345\222\214\346\225\260\346\215\256\347\273\223\346\236\204\345\255\246\344\271\240\350\204\221\345\233\276.png" "b/Week_04/id_18/\347\256\227\346\263\225\345\222\214\346\225\260\346\215\256\347\273\223\346\236\204\345\255\246\344\271\240\350\204\221\345\233\276.png" new file mode 100644 index 00000000..9a4e6b0f Binary files /dev/null and "b/Week_04/id_18/\347\256\227\346\263\225\345\222\214\346\225\260\346\215\256\347\273\223\346\236\204\345\255\246\344\271\240\350\204\221\345\233\276.png" differ diff --git "a/Week_04/id_18/\350\212\202\347\202\271\345\205\263\347\263\273\350\257\264\346\230\216.jpg" "b/Week_04/id_18/\350\212\202\347\202\271\345\205\263\347\263\273\350\257\264\346\230\216.jpg" new file mode 100644 index 00000000..da81c1d0 Binary files /dev/null and "b/Week_04/id_18/\350\212\202\347\202\271\345\205\263\347\263\273\350\257\264\346\230\216.jpg" differ