(java)整数数组中求最大连续子序列之和,并且记录开始和结束位置

来源:互联网 发布:sql优化 面试题 编辑:程序博客网 时间:2024/06/06 14:13

题意:

如题目所示,就是求一个数组中最大连续子序列之和并且记录开始和结束下标。

这是经典的一个动态规划问题,时间复杂度为O(N)

/** * 整数数组中求最大和最小连续子序列之和,并且记录开始和结束位置 * @author mss0m01 * */public class test {public static void main(String[] args) {int[] num=new int[]{0,-1,-5,2,3,1,-1,5,-3,2};int[] num4=new int[]{-2, 11, -4, 13, -5, 2, -5, -3, 12, -9};getmax(num);getmax(num4);getmin(num);getmin(num4);}// 求最大值 public static void getmax(int[] num){int s=0;// 起始下标int e=0;// 结束下标int max=0;  // 最大值int temp=0;// 中间变量int ts=0; for(int i=0;i<num.length;i++){temp=temp+num[i];if(temp<0){ts=i+1;e=i+1;temp=0;}else{if(temp>max){s=ts;e=i;max=temp;}}}System.out.println("maxsum="+max+",start:"+s+",end="+e);}// 求最小值public static void getmin(int[] num){int s=0;int e=0;int min=0;int temp=0;int ts=0;for(int i=0;i<num.length;i++){temp=temp+num[i];if(temp>0){ts=i + 1;temp = 0;}else{if(temp<min){s=ts;e=i;min=temp;}}}System.out.println("minsum="+min+",start:"+s+",end="+e);}}

特别注意:当总和小于0的时候,应该是记录一个重新开始的坐标,到总和大于原来的max的时候才能记录新的起点坐标。

阅读全文
0 0