【LeetCode-中等题】53. 最大子数组和

题目

【LeetCode-中等题】53. 最大子数组和_第1张图片

题解一:暴力解法:

【LeetCode-中等题】53. 最大子数组和_第2张图片


//暴力解法  每个元素为都循环一次,持续更新最大值
      int maxS = Integer.MIN_VALUE;
      for(int i = 0;i<nums.length;i++){
          int num = 0;
        for(int j = i;j<nums.length;j++){
          num = num+nums[j];
          maxS =  Math.max(maxS,num);
        }
      }
      return maxS;
    }

题解二:贪心算法

核心就是:若当前指针所指向的元素之前的和小于0,则直接丢弃当前元素之前的数列,使sum=当前元素,若当前指针所指向的元素之前的和大于0,正常相加当前元素

【LeetCode-中等题】53. 最大子数组和_第3张图片

  int maxSum = Integer.MIN_VALUE;//最大和
     int preSum = Integer.MIN_VALUE ;//当前位置的和
     for(int i = 0;i<nums.length;i++){

        if(preSum < 0 ) preSum = nums[i];
        else   preSum +=nums[i];

        maxSum = Math.max(maxSum,preSum);
     }
  return maxSum;

题解三:动态规划

核心就是:若前一个元素>0,则将其加到当前元素上,更新当前元素
注意,最后还需和第一位进行max比较

【LeetCode-中等题】53. 最大子数组和_第4张图片

if(nums.length ==0) return 0;
  if(nums.length ==1) return nums[0];
  int max = Integer.MIN_VALUE;
  
  for(int i =1;i<nums.length;i++){
    if(nums[i-1] > 0){
     nums[i] = nums[i]+nums[i-1];//若前一个元素>0,则将其加到当前元素上   所以上面的循环从1开始的
    }
     max =  Math.max(max,nums[i]);
    }
     max =  Math.max(max,nums[0]);//最后还需要和第1位再比较一下   ,因为第一个元素没有进入比较
   return max;

或者可以直接跳过第一个元素,到第二个元素才开始进行对前一个元素进行对比

 if(nums.length ==0) return 0;
  if(nums.length ==1) return nums[0];
  int max = Integer.MIN_VALUE;
  for(int i =0;i<nums.length;i++){
    if(i>0&&nums[i-1] > 0){//第一个元素,默认不改变,第一个元素往后的元素才和前面的元素对比
     nums[i] = nums[i]+nums[i-1];//若前一个元素>0,则将其加到当前元素上   所以上面的循环从1开始的
    }
     max =  Math.max(max,nums[i]);
    }
   return max;

你可能感兴趣的:(#,中等题,力扣,leetcode,python,算法)