[Lintcode]Maximum Subarray
来源:互联网 发布:windows帮助与支持 编辑:程序博客网 时间:2024/06/05 20:30
Given an array of integers, find a contiguous subarray which has the largest sum
Example
Given the array [−2,2,−3,4,−1,2,1,−5,3]
, the contiguous subarray [4,−1,2,1]
has the largest sum = 6
.
Note
题目要求O(n)复杂度.滑动窗口法。如果sum < 0, 那么令sum = 0重新开始。因为以负数为基数的话,无论如何加减,都比以0为基数小。但是仍然将负数与max取最大值并保存,用来防止全部为负数的情况。
public class Solution { public int maxSubArray(int[] A) { if (A == null || A.length == 0) { return 0; } int max = Integer.MIN_VALUE; int sum = 0; int len = A.length; for (int i = 0; i < len; i++) { if (sum < 0) { sum = 0; } sum += A[i]; max = Math.max(max, sum); } return max; }}
另外还可以用一维DP解决,只是空间复杂度为O(n)。注意数组最后的值未必是最大值
public class Solution { /** * @param nums: a list of integers * @return: A integer indicate the sum of minimum subarray */ public int maxSubArray(int[] nums) { // write your code if(nums.length == 0) return 0; int n = nums.length; int []global = new int[n]; global[0] = nums[0]; int res = global[0]; for(int i=1; i<n; i++) { global[i] = Math.max(nums[i], global[i - 1] + nums[i]); res = Math.max(res, global[i]); } return res > global[n - 1]? res : global[n - 1]; }}
另外在网上看到一种算法, 原理与第一种算法类似。第一种算法为每次sum小于0则重新开始。这个算法为在sum最小值处重新开始。
public class Solution { public int maxSubArray(int[] A) { if (A == null || A.length == 0){ return 0; } int max = Integer.MIN_VALUE, sum = 0, minSum = 0; for (int i = 0; i < A.length; i++) { sum += A[i]; max = Math.max(max, sum - minSum); minSum = Math.min(minSum, sum); } return max; }}
0 0
- Lintcode - Maximum Subarray II
- Lintcode - Maximum Subarray Difference
- Lintcode - Maximum Subarray III
- [LintCode]Maximum Subarray Difference
- [Lintcode]Maximum Subarray
- LintCode:Maximum Subarray III
- lintcode: Maximum Subarray
- lintcode: Maximum Product Subarray
- [LintCode]Maximum Average Subarray
- [LintCode]Maximum Subarray Difference
- [LintCode]Maximum Subarray III
- Maximum Product Subarray--lintcode
- Lintcode 617:Maximum Average Subarray
- lintcode——maximum average subarray
- lintcode 最大子数组(Maximum Subarray )(Java)
- [Lintcode]Maximum Product Subarray乘积最大子序列
- ***[Lintcode]Maximum Subarray Difference 最大子数组差
- [Lintcode]Maximum Subarray II 最大子数组 II
- 常用DOS命令
- 最长递增子序列问题的求解
- 2016年的目标
- 如何准备性能测试数据
- leetcode第19题——*Remove Nth Node From End of List
- [Lintcode]Maximum Subarray
- 佛祖保佑,永无BUG
- LeetCode 120. Triangle 解题报告
- u3d:后期屏幕渲染特效
- 3、Maven的项目的目录结构简介和一些常用命令
- Android 性能优化之使用线程池处理异步任务
- Dockerfile语法总结
- ios博客浏览工具
- Android开发中一些被冷落但却很有用的类和方法