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

运行结果

相关推荐
听风说ml9 小时前
socket编程 【C语言】
c语言·udp·tcp·socket编程
学逆向的10 小时前
C 局部静态变量
c语言·开发语言·网络安全
UIU11411 小时前
P1233 [ICPC 2001 Taejon R] 木棍加工
数据结构·c++·算法·动态规划
niyongsheng13 小时前
3D 装箱算法工程化:数据结构、放置启发式与支撑规则
数据结构·算法·rust
叉烧滑蛋15 小时前
B站台湾大学郭彦甫|MATLAB 学习笔记|04 变量与档案存取
数据结构
j7~16 小时前
【穷举、深搜与回溯算法】一棵决策树讲透全排列与子集
数据结构·c++·算法·leetcode·回溯·递归
Zwawa18 小时前
从 printf 到曲线:把数据送上 VOFA+
c语言·单片机·嵌入式
not coder19 小时前
一文讲通--从树到红黑树
数据结构·算法
爱吃香菜的初学者19 小时前
八.数据结构——哈希表(1)
数据结构·散列表
二十七日秋21 小时前
算法刷题笔记「Day 1|四道 OJ 入门题里的深坑」
c语言·汇编·数据结构·c++·笔记·python·算法