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

运行结果

相关推荐
yi0113 小时前
LeetCode 219:存在重复元素 II——哈希表记录“最近一次出现的位置”
数据结构·人工智能·笔记·python·算法·leetcode·哈希表
Escalating_xu5 小时前
【C 语言】数据在内存中的存储:补码、大小端、整型陷阱与 IEEE 754 全解析
java·c语言·网络
禾小西6 小时前
Redis 数据结构:快速的 Redis 有哪些慢操作?
数据结构·数据库·redis
H.莓飛6 小时前
【数据结构】二叉树_OJ题
linux·开发语言·数据结构·算法
好想像大佬一样能够ak所有7 小时前
Leetcode35.搜索插入位置
数据结构·算法·leetcode
chenbingjie_c8 小时前
C++ STL 适配器:stack & queue,从 vector/list 到 deque 深度解析
数据结构·c++
垆边人似月.11 小时前
华为OD算法题:查找众数及中位数
数据结构·算法·leetcode
CoderYanger11 小时前
一轮复习——F.动态规划模型总结(入门篇)
java·开发语言·数据结构·算法·leetcode·职场和发展·动态规划
浅念-12 小时前
动态规划专题:斐波那契数列模型 + 网格路径DP(LeetCode例题全解析)
笔记·算法·leetcode·面试·职场和发展·动态规划·推荐算法
一只旭宝12 小时前
数据结构与算法复习手册:从写过,到讲清楚
开发语言·数据结构·c++·算法