Maximum Subarray
来源:互联网 发布:傲剑绿色版升级数据 编辑:程序博客网 时间:2024/06/05 19:57
原题:
Find the contiguous subarray within an array (containing at least one number) which has the largest sum.
For example, given the array [-2,1,-3,4,-1,2,1,-5,4]
,
the contiguous subarray [4,-1,2,1]
has the largest sum = 6
.
即找出给定数组子数组之和的最大值。
思考过程:
一开始想错了。错的想法就不写了,带偏思路就不好了。这样理解:负数或者负数组可以把非负数分成一些组,两个相邻的非负数组若想连起来,必须保证 前面非负数组之和 比两个非负数组之间的负数或负数组绝对值大,这样它们才有连在一起的理由,连在一起才保证比后一个非负数组的和大。按照这个思路去解决问题。
解题思路:
先把数组最前面的非正数跳过。之后调用递归函数:如果是正数(组),更新ret(用来存储最后结果),如果不是,那判断它后面跟的负数组绝对值是否比它大,如果是那就跳过这个负数组更新正数组的和为0,遍历数组后面的内容。如果不是,那就让正数组的和加上负数组的和,继续向后遍历。
结果代码:
int len = 0; public int maxSubArray(int[] nums) { int i = 0,sum = 0,ret = nums[0]; len = nums.length; while (i < len && nums[i] <= 0){//先跳过数组开始的非正数 ret = Math.max(ret,nums[i]); i++; } while (i < len) {//遍历数组 int num = nums[i]; if (num >= 0) {//如果是正数,把值加到正数组的和中 sum += num; ret = Math.max(ret, sum);//更新ret i++; } else {//如果遇到负数 int[] info = isEnd(nums, i, sum);//判断正数组后面跟的负数(组)绝对值是否比它大 i = info[0]; sum = (info[1] > 0) ? info[1] : 0;//如果正数组与负数组和为正,sum更新,继续向后遍历数组;否则sum设为0,从下一个正数组重新开始 } } return ret; } public int[] isEnd(int[] nums,int begin,int sum){ int i = begin; while (i < len && nums[i] <= 0){ sum += nums[i]; i++; } int[] info = new int[2]; info[0] = i;//用于存储跳过的非正数个数 info[1] = sum;//存储前面正数组与这个非正数组的和 return info; }
阅读全文
0 0
- maximum subarray
- Maximum Subarray
- Maximum Subarray
- Maximum Subarray
- Maximum Subarray
- Maximum Subarray
- Maximum Subarray
- Maximum Subarray
- Maximum Subarray
- Maximum Subarray
- Maximum Subarray
- Maximum Subarray
- Maximum Subarray
- Maximum Subarray
- Maximum Subarray
- Maximum Subarray
- Maximum Subarray
- Maximum Subarray
- Linux-shutdown命令
- STL set容器 入门
- datatables+java实现服务器端分页,排序,查询,列的显示影藏
- tp关于m的调用问题
- C语言实现词法分析器
- Maximum Subarray
- ios11 Handheld.PlayFullScreenMovie播视频不能跳过
- LINUX基础命令
- Android 自带阻尼效果的ScrollView,仿ios效果
- boundingbox回归
- pyQt5-自定义控件
- zookeeper学习记录-04 Zookeeper安装(linux系统,伪集群)
- C3P0连接池使用教程
- java 模拟post请求