1. 程式人生 > 資訊 >魅族 17 Pro 今日直降 1700 元 ,支援 12 期免息

魅族 17 Pro 今日直降 1700 元 ,支援 12 期免息

1. 題目

輸入一個整型陣列,陣列中的一個或連續多個整陣列成一個子陣列。求所有子陣列的和的最大值。

要求時間複雜度為O(n)。

2. 示例

輸入: nums = [-2,1,-3,4,-1,2,1,-5,4]
輸出: 6
解釋: 連續子陣列 [4,-1,2,1] 的和最大,為 6。

3. 題解

本題採用動態規劃的做法:

  • 1. 空間複雜度為O(n)
    • 定義一個長度為n的dp陣列用來記錄做過的路徑,定義個max記錄最大值。dp[i]不能作為最大值的原因是,可能取了num[i]之後,dp[i] < dp[i-1],但可能dp[i] + num[+1] > dp[i - 1]。初始化:dp[0] = nums[0], max = nums[0]。
    • 從地址為1開始遍歷。
    • 對於dp[i],如果dp[i -1] > 0,那麼dp[i] = dp[i] + nums[i];否則,dp[i] = nums[i],因為負數只會讓dp[i]變的更小。
  • 2. 空間複雜度為O(1)
    • 直接使用num陣列作為dp陣列。

4. 實現

4.1 時間複雜度O(n)

 1 public class MaxSubArray42 {
 2     public int maxSubArrayA(int[] nums) {
 3         int[] dp = new int[nums.length];
 4         int max = nums[0];
5 dp[0] = nums[0]; 6 for(int i = 1; i < nums.length; i++) { 7 // 1. 第一種格式 8 // if(dp[i - 1] < 0) { 9 // dp[i] = nums[i]; 10 // } else { 11 // dp[i] = dp[i - 1] + nums[i]; 12 // } 13 // 2. 第二種格式 14 dp[i] = Math.max(dp[i - 1] + nums[i], nums[i]);
15 max = Math.max(dp[i], max); 16 } 17 return max; 18 } 19 }
View Code

4.2 時間複雜度O(1)

 1 public class MaxSubArray42 {
 2     // 不額外引入陣列
 3     public int maxSubArrayB(int[] nums) {
 4         // 記錄最大值
 5         int max = nums[0];
 6         for(int i = 1; i < nums.length; i++) {
 7             nums[i] = Math.max(nums[i - 1] + nums[i], nums[i]);
 8             max = Math.max(nums[i], max);
 9         }
10         return max;
11     }
12 }
View Code

5. 結語

  努力去愛周圍的每一個人,付出,不一定有收穫,但是不付出就一定沒有收穫! 給街頭賣藝的人零錢,不和深夜還在擺攤的小販討價還價。願我的部落格對你有所幫助(*^▽^*)(*^▽^*)!

  如果客官喜歡小生的園子,記得關注小生喲,小生會持續更新(#^.^#)(#^.^#)。

但行好事 莫問前程