题目
题解一:暴力解法:
//暴力解法 每个元素为都循环一次,持续更新最大值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,正常相加当前元素
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比较
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;