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 思路

  1. 定义一个变量sum存储子序列求和的值,定义另一个变量maxSum作为子序列求和的最大值.sum的初始值为数组的第一个元素.
  2. 遍历数组,从1开始遍历
    • 如果前一项元素的值小于0,则直接将sum设置为当前数组项的值nums[i].
    • 如果前一项元素的值大于0,sum加上nums[i].
  3. 当sum大于maxSum的时候,更新maxSum的值

2.2 反思

  1. 其实可以考虑分治算法去实现这道题目,复杂度为 \(O(n\log{n})\)
  2. 但目前基础还不够好,不太能描述整个算法思路,所以以后作补充.

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));
    }
}

Date: 2018-11-04 14:35

Author: devinkin

Created: 2018-11-04 日 14:35

Validate

猜你喜欢

转载自www.cnblogs.com/devinkin/p/9903903.html