一. 简介
本文记录力扣网上涉及数组方面的编程题,主要以 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;
}