53. 最大子数组和
问题:最大子数组和,找出数组中具有最大和的连续子数组。
思路:
- 暴力解法:通过两重循环遍历,得到所有子数组和。时间和空间复杂度都为O(n^2):
class Solution {public int maxSubArray(int[] nums) {int n=nums.length;int sum=0;ArrayList<Integer> list=new ArrayList<>();int maxNumber=Integer.MIN_VALUE;for(int i=0;i<n;i++){for(int j=i;j<n;j++){sum+=nums[j];System.out.println(sum);list.add(sum);}sum=0; }for(int max:list){if(max>maxNumber){maxNumber=max;}}//maxNumber=Collections.max(list);return maxNumber;}
}
- Kadane’s Algorithm(卡丹算法):对于数组中的每个元素,确定以该元素结尾的最大子数组和(也即动态规划:通过迭代而非递归的方法来跟踪并更新最优解)。时间复杂度O(N),空间复杂度O(1):
class Solution {public int maxSubArray(int[] nums) {int currentMax=nums[0];//当前子数组的最大和int resultMax=nums[0];//整体子数组的最大和 for(int i=1;i<nums.length;i++){//只存最大的和,每次只和最大的相加 currentMax=Math.max(nums[i],currentMax+nums[i]);System.out.println(currentMax);//检查并更新全局最大子数组和resultMax=Math.max(currentMax,resultMax);}return resultMax;}
}
-
动态规划=卡丹算法
-
分治法