首页
学习
活动
专区
圈层
工具
发布
社区首页 >专栏 >golang刷leetcode 技巧(31)连续数列

golang刷leetcode 技巧(31)连续数列

作者头像
golangLeetcode
发布2022-08-02 18:45:21
发布2022-08-02 18:45:21
3010
举报

给定一个整数数组(有正数有负数),找出总和最大的连续数列,并返回总和。

示例:

输入:[-2,1,-3,4,-1,2,1,-5,4]

输出:6

解释:连续子数组 [4,-1,2,1] 的和最大,为 6。

进阶:

如果你已经实现复杂度为 O(n) 的解法,尝试使用更为精妙的分治法求解。

解题思路

解题方案一 (动态规划)

思路

假设数组名称为arr,结果数组为result

  1. 当只有一个数字的时候,最大的连续数列只能是这个数字,所以序号为0的位置,最大值为-2,则有result[0] = arr[0]
  2. 当有两个数字时,有两种情况
    1. 保留前边的序列,此时值为result[0] + arr[1]=
    2. 不保留前边的序列,此时值为1,即arr[1]
    3. 此时选取最大值的话为1
  3. 到第三个数字时
    1. 保留前边的序列,值为result[1] + arr[2] = 1 + -3 = -2
    2. 不保留前边的序列,值为arr[2] = -3
    3. 此时选取最大值的话为-3
  4. 以此类推的话可以得到下表

序号

0

1

2

3

4

5

6

7

8

数值(arr数组)

-2

1

-3

4

-1

2

1

-5

4

保留前边的序列

-1

-4

-1

3

5

6

1

5

不保留前边的序列

1

-3

4

4

2

1

-5

4

最大值(result数组)

-2

1

-3

4

4

5

6

1

4

  1. 总结可得如下规律
  1. 最终只需取得result[]中值最大的数即为结果
代码
代码语言:javascript
复制
   public static int maxSubArray(int[] arrs) {
        int len = arrs.length;
        int maxNum = arrs[0];
        int[] result = new int[arrs.length];
        result[0] = maxNum;
        for (int i = 1; i < len; i++) {
            int a = result[i - 1] + arrs[i];  //保留前边的序列
            int b = arrs[i];  //不保留前边的序列

            int curMax = Math.max(a, b);
            result[i] = curMax;

            if (curMax > maxNum) {
                maxNum = curMax;
            }
        }
        return maxNum;
    }
代码优化

由于上述过程中,创建了result数组,但是实际上每次循环时,当前数字计算完之后就没有其他用处了,所以此处可以使用arrs数组作为result数组来用,优化后如下

代码语言:javascript
复制
    public static int maxSubArray(int[] arrs) {
        int len = arrs.length;
        int maxNum = arrs[0];
        for (int i = 1; i < len; i++) {
            int a = arrs[i - 1] + arrs[i];  //保留前边的序列
            int b = arrs[i];  //不保留前边的序列

            int curMax = Math.max(a, b);
            arrs[i] = curMax;

            if (curMax > maxNum) {
                maxNum = curMax;
            }
        }
        return maxNum;
    }

代码实现

代码语言:javascript
复制
func maxSubArray(nums []int) int {
sum:=0
max:=0
for i,n:=range nums{
    if i==0{
        max=n
        sum=n
        continue
    }
    if sum+n>n{
        sum+=n
    }else{
        sum=n
    }
    if max<sum{
        max=sum
    }
}
return max
}
本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2020-03-14,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 golang算法架构leetcode技术php 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 解题方案一 (动态规划)
    • 思路
    • 代码
      • 代码优化
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档