当前位置:   article > 正文

《力扣刷题》 数据结构入门(最大子数组和)

《力扣刷题》 数据结构入门(最大子数组和)

题目描述

当我们拥有一个整数数组 nums 时,需要找出一个具有最大和的连续子数组并返回其最大和(最少包含一个元素)

C 语言具体代码实现

第一种算法:动态规划!!!

从数组的第二项元素开始,若前面一项元素的值大于 0,则将前面一项的元素值加到当前项上来,最后找到数组中的最大值,此值即为连续子数组的最大和

  1. #include <stdio.h>
  2. int maxSubArray(int *nums, int numsSize){
  3. // 动态规划
  4. for(int i = 1; i < numsSize; i++){
  5. if(nums[i-1] > 0){
  6. nums[i] += nums[i-1];
  7. }
  8. }
  9. int Max = nums[0];
  10. for(int i = 1; i < numsSize; i++){
  11. if(nums[i] > Max){
  12. Max = nums[i];
  13. }
  14. }
  15. return Max;
  16. }
  17. int main(void){
  18. int nums[] = {-2, 1, -3, 4, -1, 2, 1, -5, 4};
  19. int max = maxSubArray(nums, 9);
  20. printf("最大子数组和:%d", max); // 最大子数组和:6
  21. return 0;
  22. }

第二种算法:贪心算法!!!

若当前指针所指元素与之前元素的和小于此元素,则丢弃当前元素之前的数列

  1. #include <stdio.h>
  2. #include <math.h>
  3. // 贪心算法
  4. int maxSubArray(int *nums, int numsSize){
  5. int current_num, max_num;
  6. current_num = max_num = nums[0];
  7. for(int i = 1; i < numsSize; i++){
  8. current_num += fmax(nums[i], current_num+nums[i]);
  9. max_num = fmax(max_num, current_num);
  10. }
  11. return max_num;
  12. }
  13. int main(void){
  14. int nums[] = {-2, 1, -3, 4, -1, 2, 1, -5, 4};
  15. int max = maxSubArray(nums, 9);
  16. printf("最大子数组和:%d", max); // 最大子数组和:6
  17. return 0;
  18. }

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/我家自动化/article/detail/511313
推荐阅读
相关标签
  

闽ICP备14008679号