LintCode-最大子数组
2016-04-06 17:16
537 查看
题目描述:
给定一个整数数组,找到一个具有最大和的子数组,返回其最大和。
注意事项
子数组最少包含一个数
样例
给出数组
挑战
要求时间复杂度为O(n)
开始的解法:
暴力破解,从长度为1的子数组开始查找,计算每个子数组的和,找出最大的。
但是面对大数据量的时候会超时。
第二种解法,复杂度为O(n),因为是求连续的子数组的和,所以当当前的和为负数时,再加到下一个元素上肯定会减小整体的和,所以把当前和sum直接职位下一个元素,max永远记录最大的sum值。代码如下:
给定一个整数数组,找到一个具有最大和的子数组,返回其最大和。
注意事项
子数组最少包含一个数
样例
给出数组
[−2,2,−3,4,−1,2,1,−5,3],符合要求的子数组为
[4,−1,2,1],其最大和为
6
挑战
要求时间复杂度为O(n)
开始的解法:
暴力破解,从长度为1的子数组开始查找,计算每个子数组的和,找出最大的。
public class Solution { /** * @param nums: A list of integers * @return: A integer indicate the sum of max subarray */ public int maxSubArray(int[] nums) { int max = nums[0]; int index = 1; while(index <= nums.length){ for(int i=0;i<=nums.length-index;i++){ int sum = 0; for(int j=0;j<index;j++){ sum += nums[i+j]; } if(sum > max){ max = sum; } } index++; } return max; } }
但是面对大数据量的时候会超时。
第二种解法,复杂度为O(n),因为是求连续的子数组的和,所以当当前的和为负数时,再加到下一个元素上肯定会减小整体的和,所以把当前和sum直接职位下一个元素,max永远记录最大的sum值。代码如下:
public class Solution { /** * @param nums: A list of integers * @return: A integer indicate the sum of max subarray */ public int maxSubArray(int[] nums) { int max = nums[0]; int sum = nums[0]; for(int i=1;i<nums.length;i++){ if(sum < 0){ sum = nums[i]; }else{ sum += nums[i]; } if(sum > max){ max = sum; } } return max; } }
相关文章推荐
- 最大连通子数组求和
- hdu 4123 树形dp+rmq
- Log4J日志配置详解
- 团队加分作业
- 在Eclipse中配置Teamcenter二次开发环境时候debug,Tteamcenter不能正常登录
- LeetCode *** 136. Single Number
- LeetCode [Symmetric Tree]
- mysql 一行数据+标题转换为两列
- Nodejs Error: Cannot find module 'unicode/category/So'
- Kali Linux
- .价值观作业
- 数据结构中的栈
- 使用Redis的理由
- uva 558 Wormholes
- MyEclipse控制台中文输出乱码
- 使用ViewPager加载页面出现空白--笔记
- mysql merge table
- no field package.preload[‘ffi’]
- ASP.NET MVC Model绑定(四)
- 可以打开mdb文件的小软件