zoukankan      html  css  js  c++  java
  • 一维数组最大子数组续(单步执行,回滚)

    一:程序代码

    package shuzu;
    
    import java.util.ArrayList;
    import java.util.List;
    import java.util.Scanner;
    
    public class xuexi {
    	
    	public static void main(String[] args) {
    		int number;
    		System.out.println("请输入数组的长度");
    		Scanner sc=new Scanner(System.in);
    		number=sc.nextInt();
    		int array[]=new int[number];
    		System.out.println("请输入数组的值");
    		for(int i=0;i<number;i++) {
    			array[i]=sc.nextInt();
    		}//输入数组的值
    		int maxsum,maxstart;	
    		
    		maxsum=array[0];
    		maxstart=array[0];
    		int pointstart=1,pointend=1;
    		List<Integer> type1=new ArrayList<Integer>();
    		List<Integer> type2=new ArrayList<Integer>();
    		List<Integer> type3=new ArrayList<Integer>();
    		List<Integer> type4=new ArrayList<Integer>();
    		List<Integer> type5=new ArrayList<Integer>();
    		
    		for(int i=1;i<number;i++)
            {
    			type1.add(maxstart);
                type2.add(maxsum);
                type3.add(pointstart);
                type4.add(pointend);
                type5.add(i);
                if(maxstart<0)
                {
                   maxstart=0;
                   pointstart=i+1;
                }
                maxstart+=array[i];//两两组合求和
                if(maxstart>maxsum)
                {
                	maxsum=maxstart;
                	pointend=i+1;
                }
                
                
                	
                	System.out.println("第"+i+"步子数组的和的数值"+maxsum +" 位置是"+pointstart+"到"+pointend +" 检查的子集的个数是:"+i+" 总共有"+number+"个数据");
                	System.out.println("请输入你要回滚的层数,输入非数字的字符进入下一步");
                	int back=0;
                	if(sc.hasNextInt())
                	{
                		back=sc.nextInt();
                		maxstart=type1.get(back-1);
                		maxsum=type2.get(back-1);
                		pointstart=type3.get(back-1);
                		pointend=type4.get(back-1);
                		i=type5.get(back-1)-1;
                	}
                	else sc.next();
                	
                  
            }
            
            System.out.println("子数组的最大和为:");
            System.out.println(maxsum);
           
        }
    
    }
    

      程序实验结果截图:

    设计思想:首先定义存储数据类型的变量,利用arraylist数组存储记录子数组最大值,以及子数组的开始数据位置和结束数据位置,还要存储子数组的个数

    定义back变量通过输入整形数字确定回滚的步揍,

                 maxstart=type1.get(back-1);
                  maxsum=type2.get(back-1);
                  pointstart=type3.get(back-1);
                  pointend=type4.get(back-1);
                  i=type5.get(back-1)-1;

    这些通过调用arraylist数组,把回滚后的数据复制到当前数值中

    通过输入非整形字符可以单步执行程序到程序截止。

  • 相关阅读:
    JS判断数组中是否有重复元素的方法
    根据类名找到元素
    JS获取页面元素并修改
    JS实现会动的小车
    动态规划------最长公共子串(连续)
    动态规划------最长递增子序列
    买卖股票的最佳时期
    操作系统清华大学版笔记(十一)死锁、银行家算法和进程间通信(直接通信、间接通信)
    128 最长连续序列
    链表------删除有序单链表中重复的节点
  • 原文地址:https://www.cnblogs.com/1502762920-com/p/10770619.html
Copyright © 2011-2022 走看看