Given an integer array nums
, find the contiguous subarray (containing at least one number) which has the largest sum and return its sum.數組
Example:微信
Input: [-2,1,-3,4,-1,2,1,-5,4], Output: 6 Explanation: [4,-1,2,1] has the largest sum = 6.
翻譯:spa
給定一個整數組,找到相加之和最大的子數組,返回最大的和翻譯
思路1:code
暴力循環不解釋blog
1.循環遍歷一個值的和,找出最大的那個get
2.循環遍歷兩個相鄰數的和,找出最大的那個it
3.循環遍歷三個相鄰數的和,找出最大的那個io
...ast
最後比較全部的最大和,獲得最最大的那個
代碼
class Solution { public int maxSubArray(int[] nums) { int sum = nums[0]; int length = nums.length; for(int i = 1;i<=length;i++){ int once = getOnce(nums,i); if(once>sum){ sum = once; } } return sum; } public int getOnce(int[] nums,int n){ int max = nums[0]; for(int i = 0;i<=(nums.length-n);i++){ int add = 0; int nn = n; while(--nn >= 0){ add+=nums[i+nn]; } if(add > max){ max = add; } } return max; } }
跑起來沒問題,可是提交後報錯了!Time Limit Exceeded,就是運行超時了,由於循環了3遍,時間複雜度是N的3次方啊,因此拋棄
百度獲得解決辦法
思路2:
原數組 [-2,1,-3,4,-1,2,1,-5,4]
設置初始最大和爲第一個數-2,從第二個數開始遍歷
這裏有一個思惟技巧,就是隻循環一遍,獲得每一個以當前值結尾的數組的最大值,一開始我沒想明白這一塊,後來多想幾遍也就明白了
代碼:
class Solution { public int maxSubArray(int[] nums) { int sum = nums[0]; int max = nums[0]; for (int i = 1; i < nums.length; i++) { System.out.print("當前值:"+nums[i]+"--當前值+前面的最大和:"+(sum + nums[i])); sum = Math.max(nums[i], sum + nums[i]); System.out.println("當前的最大和:"+sum); max = Math.max(max, sum); } return max; } }
爲什麼要這樣比較呢,由於對於當前值來講,有兩種可能
1.和前面的數組抱團
2.本身單幹
若是本身單幹比抱團還厲害,固然本身單幹咯
歡迎關注個人微信公衆號:安卓圈