最近找实习刷题中,遇到好多问题,有coding2小时还报错的无奈,也有战胜100%的孤独,谨在此记录一二,与君共勉。
给定一个整数数组 nums,找到一个具有最大和的连续子数组(子数组最少包含一个元素),返回其最大和(来自leetcode53题)。
先无脑写个暴力递归
class Solution { public int maxSubArray(int[] nums) { return getMax(nums,nums.length-1); } private int getMax(int[] nums, int index) { if(index=0) { return nums[0]; } return Math.max(chosed(nums,index-1)+nums[index],getMax(nums, index-1)); } private int chosed(int[] nums,int index) { if(index<0) { return 0; } return Math.max(chosed(nums, index-1)+nums[index],0); } }
OJ居然过了。。。
按这个递归动态规划想了好久,感觉思维僵化了,百度了一下,参考博主窗雨树雪的方法,写了个O(n)的。
class Solution {
public int maxSubArray(int[] nums) {
int sum = 0;
int maxSum =Integer.MIN_VALUE;
//找到nums中最大值
for (int i = 0; i < nums.length; i++) {
if(nums[i]>maxSum) {
maxSum = nums[i];
}
}
//当一个数加上前面的和大于最大就赋值,小于零则不可能为起始位
for (int i = 0; i < nums.length; i++) {
sum += nums[i];
if(sum>maxSum) {
maxSum = sum;
}else if(sum<0){
sum = 0;
}
}
return maxSum;
}
}
oj:13ms,不知道为啥,插不了图片了
,还行口巴,恳请各位指正。
除特别标注引用外,以上均来自原创,如有侵权,请联系本人删除。