题目
给定一个整数数组 nums ,找到一个具有最大和的连续子数组(子数组最少包含一个元素),返回其最大和,并顺序打印子序列。
示例:
输入: -2,1,-3,4,-1,2,1,-5,4
输出: 6
解释: 连续子数组 [4,-1,2,1] 的和最大,为 6。
代码
public class MaximumSubSequenceSum {
public static void main(String[] args) {
Scanner s = new Scanner(System.in);
String array = s.nextLine();
if(array.length()<=2){return;}
int[] data = Arrays.stream(array.split(",")).mapToInt(Integer::parseInt).toArray();
System.out.println(subSequenceSum01(data));
System.out.println(subSequenceSum02(data));
}
//算法一: 穷举遍历,比较找出最大的
private static Integer subSequenceSum01(int[] array){
int maxNum=0;
Map<Integer, List<Integer>> subSequence=new HashMap<>();
for (int i = 0; i < array.length; i++) {
for (int j = i; j < array.length; j++) {
int thisNum=0;
List<Integer> list=new LinkedList<>();//保存子序列
// i: 子序列开始下标 j:结束下标
for (int k = i; k <= j; k++){
thisNum+=array[k]; //每一次计算里循环子序列和
list.add(array[k]);
}
if(thisNum>maxNum){
maxNum=thisNum;
subSequence.put(maxNum,list);//每一次最大值和对应子序列
}
}
}
// Arrays.toString 数组转换字符串
System.out.println("算法一:"+Arrays.toString(subSequence.get(maxNum).toArray()));
return maxNum;
}
//算法二, 改进算法一,不需要计算每一次子序列和,采用累加方式,一步步找出最大值
private static Integer subSequenceSum02(int[] array){
int maxNum=0;
Map<Integer, List<Integer>> subSequence=new HashMap<>();
for (int i = 0; i < array.length; i++) {
int thisNum=0;
List<Integer> list=new LinkedList<>();//保存子序列
for (int j = i; j < array.length; j++) {
thisNum+=array[j]; //子序列值累加,从开始累加到结尾计算出最大值
list.add(array[j]);
if(thisNum>maxNum){
maxNum=thisNum;
List<Integer> subList = new ArrayList<>();//每次都需要一个新集合,否则值会变
subList.addAll(list);
subSequence.put(maxNum,subList);//每一次最大值和对应子序列
}
}
}
System.out.println("算法二:"+Arrays.toString(subSequence.get(maxNum).toArray()));
return maxNum;
}
}