力扣上C语言编程题:最大子数组和(涉及数组)

一. 简介

本文记录力扣网上涉及数组方面的编程题,主要以 C语言实现。

二. 力扣上C语言编程题:最大子数组和

给你一个整数数组 nums ,请你找出一个具有最大和的连续子数组(子数组最少包含一个元素),返回其最大和。

是数组中的一个连续部分。

提示:

  • 1 <= nums.length <= 105
  • -104 <= nums[i] <= 104

示例1:

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

输出:6

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

示例2:

输入: nums = [1]

输出:1

解题思路:

使用贪心解法。什么是贪心解法?

"贪心解法"(Greedy Algorithm)是一种在算法设计中常用的策略,它通过每一步选择当前状态下局部最优解(即最有利的选择),期望通过这样的方式最终得到全局最优解。

贪心算法的核心是:每一步都做出局部最优的选择,希望通过局部最优解达到全局最优解。

**局部最优:**当前 "连续和" 为负数时立刻放弃,从下一个元素重新计算 "连续和" ,因为负数加上下一个元素 "连续和"只会越来越小。

**全局最优:**选取最大"连续和"

具体方法:

(1) 遍历数组,如果前面数组和小于 0,则从 nums[i] 开始重新新一轮求和计算;(因为数组和为负数时,再加下一个元素,只会让总和变小,即都会加重负担);

(2) 每次记录数组和的最大值;

C代码实现如下:

复制代码
int maxSubArray(int* nums, int numsSize) {
    if ((!nums) || (numsSize == 0)) {
        return -1;
    }

    int i = 0;
    int prev_sums = nums[0];
    int max_sums = nums[0];

    //下标从1开始遍历
    for(i = 1; i < numsSize; i++) { 
        if(prev_sums < 0) { //如果前面数组和小于0,则从nums[i]重新开始计数
            prev_sums = nums[i];
        }
        else { //前面数组和 >=0,则继续加nums[i]
            prev_sums = prev_sums + nums[i];
        }
        //每次更新子数组和的最大值
        if(prev_sums > max_sums) {
            max_sums = prev_sums;
        }
    }

    return max_sums;
}
相关推荐
愚者游世13 分钟前
力扣解决二进制&题型常用知识点梳理
c++·程序人生·算法·leetcode·职场和发展·改行学it
圣保罗的大教堂14 分钟前
leetcode 3640. 三段式数组 II 困难
leetcode
Geoking.17 分钟前
前缀和算法:从一道 LeetCode 题看区间求和优化思想
算法·leetcode·职场和发展
爱吃rabbit的mq19 分钟前
第7章 逻辑回归:二分类的基础
算法·分类·逻辑回归
DFT计算杂谈21 分钟前
VASP+Wannier90 计算位移电流和二次谐波SHG
java·服务器·前端·python·算法
执着25927 分钟前
力扣102、二叉树的层序遍历
数据结构·算法·leetcode
Tisfy29 分钟前
LeetCode 2976.转换字符串的最小成本 I:floyd算法(全源最短路)
算法·leetcode··floyd·题解
v_for_van33 分钟前
力扣刷题记录4(无算法背景,纯C语言)
c语言·算法·leetcode
dazzle39 分钟前
Python数据结构(十五):归并排序详解
数据结构·python·算法
启友玩AI1 小时前
方言守护者:基于启英泰伦CI-F162GS02J芯片的“能听懂乡音”的智能夜灯DIY全攻略
c语言·人工智能·嵌入式硬件·ai·语音识别·pcb工艺