java数据结构与算法刷题目录(剑指Offer、LeetCode、ACM)-----主目录-----持续更新(进不去说明我没写完):https://blog.csdn.net/grd_java/article/details/123063846 |
---|
解题思路:时间复杂度O( n n n),空间复杂度O( 1 1 1) |
---|
- 走完全程,如果我和你在一起会变好,我们就一起走,否则不如分道扬镳。回顾我最光辉的时刻就是和不同的人在一起,变成更好的最长连续。
- 这道题典型的贪心题目,那么多人,和不同的人在一起,你可以获得很多,或者会失去很多。而我们想找到最大的方案。
- 如果当前已获得的连续数组是负数,后面遇到的数是正数,那么我们和当前获取的连续数组不如分道扬镳。和遇到的这个正数一起走。何必非要一起走向痛苦的牢笼呢?不如放下彼此,和新的人尝试迎接美好。
- 我们题目需要的结果是,我们走完全程后,最幸福的时光,而不是到了终点后的幸福值。
另外,这道题可以通过分治算法,不断找寻局部最优,但是需要额外空间(状态和递归),显然不适用这道题,没必要强行往这道题上套。
代码 |
---|
class Solution {
public int maxSubArray(int[] nums) {
int prefix = 0,result = nums[0];//prefix是现在和我们一起走的人,result是我们现在获取的幸福值
for (int i = 0; i < nums.length; i++) {
//如果i元素加入我们可以更幸福,那么就让i加入,也就是选prefix+nums[i]
//如果和prefix一起很痛苦,不如放弃prefix,和nums[i]一起迎接美好
//也就是说,已有的连续数组prefix,如果加上nums[i],我们幸福感更好,就选prefix+nums[i]
//如果prefix已经是拖累,nums[i]进来,也是拖累人家nums[i],不如和prefix分道扬镳
prefix = Math.max(nums[i],prefix+nums[i]);
//result,只保留我们一路上,获得过的最大幸福感
result = Math.max(result,prefix);
}
return result;
}
/**
* 动态规划O(n) 如果二维数组分析是下面这种梯形,大概率可以O(n^2)变O(n)
* [-2,1,-3,4,-1,2,1,-5,4]
* -2 1 -3 4 -1 2 1 -5 4
* 下标 1 2 3 4 5 6 7 8 9
* -2 1 -2 -1 -4 0 -1 1 2 -3 1
* 1 2 1 -2 2 1 3 4 -1 3
* -3 3 -3 1 0 2 3 -2 2
* 4 4 4 3 5 6 -1 3
* -1 5 -1 1 2 -3 1
* 2 6 2 3 -2 2
* 1 7 1 -4 0
* -5 8 -5 -1
* 4 9 4
*
* 我们发现,是一个倒三角形状,
* 这样的一般是不用额外的空间的
* 可以看见,下标为1时,多出来的元素是-2
* 下标为2时,多出来的是1,因为1>-1,后面的和,都比下标为1的大 (下标为1,前两个元素作为前缀和为-1,下标为2,第二个元素为和,1)
* 那么前缀不断在变化,那么我们可以直接获取,保留大的
*/
}