Backblaze:Chia 幣挖礦收益率很低,且逐漸下降
阿新 • • 發佈:2021-07-10
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. 結語
努力去愛周圍的每一個人,付出,不一定有收穫,但是不付出就一定沒有收穫! 給街頭賣藝的人零錢,不和深夜還在擺攤的小販討價還價。願我的部落格對你有所幫助(*^▽^*)(*^▽^*)!
如果客官喜歡小生的園子,記得關注小生喲,小生會持續更新(#^.^#)(#^.^#)。
但行好事 莫問前程