- 最大子序和
给定一个整数数组 nums ,找到一个具有最大和的连续子数组(子数组最少包含一个元素),返回其最大和。
package com.qianfeng.weekendDay01;
public class Test {
public static void main(String[] args) {
int[] number = new int[] {-2,1,-3,4,-1,2,1,-5,4};
Solution solution = new Solution();
int sum = solution.maxSubArray(number);
System.out.println(sum);
}
}
class Solution {
public int maxSubArray(int[] nums) {
int sum = 0; //记录和
int maxSum = nums[0]; //记录最大和
if(nums.length == 1){
return nums[0];
}
for(int i = 0; i < nums.length; i++) {
if(sum < 0) {
sum = 0;
}
sum = sum + nums[i];
if(sum > maxSum) {
maxSum = sum;
}
}
return maxSum;
}
}
算法1:贪心算法
主要思想
- 从数组第一个数字开始一直检索到最后一个数字
- 设定变量数组当前和sum、数组最大和maxSum、循环量i、数组number
- 数组每一次检索,都判断一次当前和是否大于0,如果大于零则继续,小于零则舍弃当前和,当然每一次循环中都要讲当前和与最大和进行比较
package com.qianfeng.weekendDay01;
public class Test {
public static void main(String[] args) {
int[] a = new int[] {-2,1,-3,4,-1,2,1,-5,4};
int[] b = a;
int max = b[0];
for(int i = 1; i < a.length; i++) {
if(a[i-1] > 0) {
b[i] = a[i-1] + a[i];
}
}
for (int i = 0; i < b.length; i++) {
if(b[i] > max) {
max = b[i];
}
}
System.out.println(max);
}
}
方法二:动态规划
- 检索整个数组
- 创建一个输入数组的副本
- 从数组第一个元素开始,如果前一个元素大于0,那么就加上前一个数组元素,然后其和替换该数组元素,重复这个过程
- 检索数组副本,返回最大的那个数,这个数即为最大子序和

被折叠的 条评论
为什么被折叠?



