LeetCode第53題

  • 2019 年 10 月 7 日
  • 筆記

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: 6Explanation: [4,-1,2,1] has the largest sum = 6.

翻譯:

給定一個整數組,找到相加之和最大的子數組,返回最大的和

思路1:

暴力循環不解釋

1.循環遍歷一個值的和,找出最大的那個

2.循環遍歷兩個相鄰數的和,找出最大的那個

3.循環遍歷三個相鄰數的和,找出最大的那個

最後比較所有的最大和,得到最最大的那個

代碼

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.自己單幹

如果自己單幹比抱團還厲害,當然自己單幹咯