kadane算法(求最大子数组)(C++)

前言

Kadane算法是一种用于求解最大子数组和问题的算法,其时间复杂度为O(n)。


一、kadane算法(C++)

int getMaxSubarraySum(int a[], int n)
{
    int maxSum = a[0];  // 最大子数组和,初始为a[0]
    int curSum = a[0];  // 当前子数组和,初始为a[0]

    for (int i = 1; i < n; i++) {
        if (curSum < 0) {
            curSum = a[i];//更新起始点
        } else {
            curSum += a[i];
        }

        if (curSum > maxSum) {
            maxSum = curSum;//找出最大值
        }
    }

    return maxSum;
}

其算法利用的核心思想为做加法之后判断当前和(curSum)是否为负,若为负,则取下一正数为新的起始点,且每一次循环都与当前最大和(maxSum)比较。

二、例题

1.【问题描述】

【问题描述】

对于一个具有 n 个元素的整型数组 a,求具有最大连续和的子数组(最少具有一个元素)。

【输入形式】

输入的第一行为一个整数 n ,接下来的一行为 n 个整数,表示数组的元素。

【输出形式】

输出具有最大连续和的子数组的起始编号和结束编号(数组编号为0~n-1)。
【样例输入】

 8
 3 -5 1 5 -4 12 0 -1

【样例输出】

 2 5

2.解答

代码如下(代码除函数外来源于CG网):

#  include  <iostream>
using  namespace  std;

void  getMaxSum(int  a[],  int  n,  int  &Left,  int  &Right);

int  main()
{
        int  n;
        cin>>n;

        int  *p=new  int[n];//使用动态数组

        for(int  i=0;  i<n;  i++)
                cin>>p[i];

        int  Left,  Right;
        getMaxSum(p,n,Left,Right);

        cout<<Left<<"  "<<Right<<endl;
        delete[]  p;

        return  0;
}

void  getMaxSum(int  a[],  int  n,  int  &Left,  int  &Right)
//使用int类型引用参数,使得该参数能在函数内部修改
{
	int curLeft = 0;
    int curRight = 0;
    int maxSum = a[0];
    int curSum = a[0];

    for (int i = 1; i < n; i++) {
        if (curSum < 0) {
            curSum = a[i];
            curLeft = i;
        } else {
            curSum += a[i];//向前遍历
        }

        if (curSum > maxSum) {//比较并记录
            maxSum = curSum;
            curRight = i;
            Left = curLeft;
            Right = curRight;
        }
    }
}

最后只是改为记录最大子数组的起始和终止的位置

总结

kadane算法本质是从左向右遍历数组,遇到和为负数则重置当前和,最后在所有结果中找出最大和即为最终解。

  • 4
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值