赞
踩
当我们拥有一个整数数组 nums 时,需要找出一个具有最大和的连续子数组并返回其最大和(最少包含一个元素)
第一种算法:动态规划!!!
从数组的第二项元素开始,若前面一项元素的值大于 0,则将前面一项的元素值加到当前项上来,最后找到数组中的最大值,此值即为连续子数组的最大和
- #include <stdio.h>
-
- int maxSubArray(int *nums, int numsSize){
- // 动态规划
- for(int i = 1; i < numsSize; i++){
- if(nums[i-1] > 0){
- nums[i] += nums[i-1];
- }
- }
- int Max = nums[0];
- for(int i = 1; i < numsSize; i++){
- if(nums[i] > Max){
- Max = nums[i];
- }
- }
- return Max;
- }
-
- int main(void){
- int nums[] = {-2, 1, -3, 4, -1, 2, 1, -5, 4};
- int max = maxSubArray(nums, 9);
- printf("最大子数组和:%d", max); // 最大子数组和:6
- return 0;
- }
![](https://csdnimg.cn/release/blogv2/dist/pc/img/newCodeMoreWhite.png)
第二种算法:贪心算法!!!
若当前指针所指元素与之前元素的和小于此元素,则丢弃当前元素之前的数列
- #include <stdio.h>
- #include <math.h>
-
- // 贪心算法
- int maxSubArray(int *nums, int numsSize){
- int current_num, max_num;
- current_num = max_num = nums[0];
- for(int i = 1; i < numsSize; i++){
- current_num += fmax(nums[i], current_num+nums[i]);
- max_num = fmax(max_num, current_num);
- }
- return max_num;
- }
-
- int main(void){
- int nums[] = {-2, 1, -3, 4, -1, 2, 1, -5, 4};
- int max = maxSubArray(nums, 9);
- printf("最大子数组和:%d", max); // 最大子数组和:6
- return 0;
- }
![](https://csdnimg.cn/release/blogv2/dist/pc/img/newCodeMoreWhite.png)
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。