LeetCode-最大子序列和
LeetCode-最大子序列和
1 Easy-最大子序列和
1.1 题目描述
给定一个整数数组 nums ,找到一个具有最大和的连续子数组(子数组最少包含一个元素),返回其最大和。
1.2 示例:
输入: [-2,1,-3,4,-1,2,1,-5,4],
输出: 6
解释: 连续子数组 [4,-1,2,1] 的和最大,为 6。
1.3 进阶:
如果你已经实现复杂度为 O(n) 的解法,尝试使用更为精妙的分治法求解。
2 自己的解答
2.1 思路
- 定义一个变量sum存储子序列求和的值,定义另一个变量maxSum作为子序列求和的最大值.sum的初始值为数组的第一个元素.
- 遍历数组,从1开始遍历
- 如果前一项元素的值小于0,则直接将sum设置为当前数组项的值nums[i].
- 如果前一项元素的值大于0,sum加上nums[i].
- 当sum大于maxSum的时候,更新maxSum的值
2.2 反思
- 其实可以考虑分治算法去实现这道题目,复杂度为 \(O(n\log{n})\)
- 但目前基础还不够好,不太能描述整个算法思路,所以以后作补充.
2.3 代码
package algorithm.easy; public class MaxSubArray { public static int solution(int[] nums) { // 记录子序列的和 int sum = nums[0]; // 记录子序列中最大的和 int maxSum = sum; for (int i = 1; i < nums.length; i++) { // 如果子序列和小于或者等于零,则将其设置为下一个数 if (sum <= 0) { sum = nums[i]; } else { // 子序列和大于等于零,和下一个数相加 sum += nums[i]; } // 如果自序列的和大于记录的最大和,则将其当前的最大sum设置为sum if (maxSum < sum) { maxSum = sum; } } return maxSum; } public static void main(String[] args) { int[] test1 = {-2,1,-3,4,-1,2,1,-5,4}; System.out.println(solution(test1)); } }