C语言/数据结构动态规划题解:Kadane算法求最大子数组和——O(n)时间O(1)空间

问题描述

小明在玩一个有趣的数字游戏:他有一排连续的数字积木,每个积木上写着一个整数(可能是正数或负数)。现在,他想找出这些积木中连续一段(子数组)的和的最大值 是多少。例如,如果积木序列是 [-2, 1, -3, 4, -1, 2, 1, -5, 4],那么连续和最大的子数组是 [4, -1, 2, 1],其和为 6。

请你帮助小明设计一个高效的算法,计算任意给定整数数组中连续子数组的最大和。

测试样例

样例1:

输入:nums = [-2, 1, -3, 4, -1, 2, 1, -5, 4] 输出:6 解释:最大和的连续子数组是 4, -1, 2, 1,和为 6。

样例2:

输入:nums = [1, 2, 3, 4, 5] 输出:15 解释:整个数组的和最大,为 15。

样例3:

输入:nums = [-1, -2, -3, -4] 输出:-1 解释:所有数字都是负数,最大子数组是单个元素 -1,和为 -1。

约束条件

  • 1 ≤ nums.length ≤ 10⁵
  • -10⁴ ≤ numsi ≤ 10⁴
  • 要求算法时间复杂度为 O(n)

程序代码

#include <stdio.h>

int maxSubArray(int* nums, int numsSize) {

int currentSum = nums0;

int maxSum = nums0;

for (int i = 1; i < numsSize; i++) {

// 要么接续前面的子数组,要么从当前元素重新开始

if (currentSum + numsi > numsi) {

currentSum = currentSum + numsi;

} else {

currentSum = numsi;

}

if (currentSum > maxSum) {

maxSum = currentSum;

}

}

return maxSum;

}

int main() {

int nums1\[\] = {-2, 1, -3, 4, -1, 2, 1, -5, 4};

int nums2\[\] = {1, 2, 3, 4, 5};

int nums3\[\] = {-1, -2, -3, -4};

printf("%d\n", maxSubArray(nums1, 9)); // 6

printf("%d\n", maxSubArray(nums2, 5)); // 15

printf("%d\n", maxSubArray(nums3, 4)); // -1

return 0;

}

cpp 复制代码
#include <stdio.h>

int maxSubArray(int* nums, int numsSize) {
    int currentSum = nums[0];
    int maxSum = nums[0];
    
    for (int i = 1; i < numsSize; i++) {
        // 要么接续前面的子数组,要么从当前元素重新开始
        if (currentSum + nums[i] > nums[i]) {
            currentSum = currentSum + nums[i];
        } else {
            currentSum = nums[i];
        }
        
        if (currentSum > maxSum) {
            maxSum = currentSum;
        }
    }
    
    return maxSum;
}

int main() {
    int nums1[] = {-2, 1, -3, 4, -1, 2, 1, -5, 4};
    int nums2[] = {1, 2, 3, 4, 5};
    int nums3[] = {-1, -2, -3, -4};
    
    printf("%d\n", maxSubArray(nums1, 9));  // 6
    printf("%d\n", maxSubArray(nums2, 5));  // 15
    printf("%d\n", maxSubArray(nums3, 4));  // -1
    
    return 0;
}

运行结果

相关推荐
鹿角片ljp1 小时前
从 Kimi Cyber Reasoning 学习网络安全推理数据集:从 Reasoning SFT 到安全 Agent 数据设计
数据结构·算法
雷✘2 小时前
C 程序从源文件到运行:预处理、编译、汇编、链接重定位与执行环境
c语言
Logic1012 小时前
C语言/数据结构位运算题解:异或XOR找出数据表中的“独特编号“——只出现一次的数字
c语言·数据结构·数组·位运算·时间复杂度·算法题·异或性质
endeavor123 小时前
BootLoader与OTA学习(三)
c语言·stm32
wabs6663 小时前
关于二叉树【力扣100.相同的树的思考】
数据结构·c++·算法·leetcode·二叉树·递归法
布莱克6054 小时前
理解内存泄漏:成因、发现方法与解决策略(C++ 举例)
c语言·c++·内存泄漏
qianyanwanyv5 小时前
数据结构概念
数据结构
Logic1015 小时前
C语言/数据结构位运算题解:异或XOR找出英雄升级系统中的“独特经验值“——只出现一次的数字
c语言·数据结构·数组·位运算·时间复杂度·算法题·异或性质