问题:
/**
* 给定一个整数数组 nums ,找到一个具有最大和的连续子数组(子数组最少包含一个元素),返回其最大和,并顺序打印子序列。
* 示例:
* 输入: [-2,1,-3,4,-1,2,1,-5,4],
* 输出: 6,并打印连续子序列
* 解释: 连续子数组 [4,-1,2,1] 的和最大,为 6。
*/
测试main方法:
public static void main(String[] args) { int[] data={1,-2,3,4,-8,12,2}; 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; }