zoukankan      html  css  js  c++  java
  • Java实验——输出一个数组里面连续子数组最大的和

    在实现这个算法的时候,想法是假如有一个数组{A,B,C),之后创建一个List存储{A,A+B,A+B+C);

    若要求里面最大的连续数组的时候,用List后面的第i元素减去前面的第z元素的值如果最大的话(保证连续),那就说明从位置z+1到位置i的连续数组有最大的和。然而在情况只有在特殊的情况下,最大值的位置若在最小值之后,并且最小值小于等于0的情况下,用最大值减去最小值即为连续子集最大值(保证最大),其实现的时间复杂度为O(n),若最大值位置在最小值之前,则该算法需要寻找出List数组里面的差值极大值才行。

    实现的代码:

    package lainxu;
    
    import java.util.ArrayList;
    import java.util.Collections;
    import java.util.List;
    import java.util.Scanner;
    
    public class ShowM {
        public static void main(String[] args) {
            // TODO 自动生成的方法存根
            
            List<Integer> max=new ArrayList<Integer>();
            
            int maxp=-1; //储存从1开始的子组和最大值的位置
            
            Scanner it=new Scanner(System.in);
            
            int num=0;
            //手动输入区域
            //--------------------------------------------
            System.out.println("请输入你想要查找数组的长度:");
            while(num<=0)    //实现用户输入数组的大小
            {
                if(it.hasNextInt())
                {
                    num=it.nextInt();
                    if(num<=0)
                    {
                        System.out.println("输入数组不能小于等于0,请重新输入");
                    }
                    
                }
                else
                {
                    it.next();
                    System.out.println("输入格式错误,请重新输入");
                }
            }
            //--------------------------------------------
            
            List<Integer> nums=new ArrayList<Integer>();    //用于储存数组
            
            max.add(0);        //添加一个max使其为0
            for(int i=1;i<=num;i++)        //储存数组
            {
                //--------------------------------------------
                //手动输入区域
                System.out.println("请输入第"+i+"个数:");
                Integer g_down=null;
                
                while(g_down==null)
                {
                    if(it.hasNextInt())
                    {
                        g_down=it.nextInt();
                        max.add(g_down+max.get(i-1));
                        nums.add(g_down);
    
                    }
                    else
                    {
                        it.next();
                        System.out.println("输入格式错误,请重新输入");
                    }
                }
                //--------------------------------------------
                
            }
    
            
            System.out.println("输入的数组是"+nums.toString());
            
    
            
            int minn=max.get(0);
            int minp=0;
            int remax=max.get(1);
            maxp=0;
            for(int i=1;i<max.size();i++)
            {
                List<Integer> max2=max.subList(0, i);
                int g_min=Collections.min(max2);
                if(max.get(i)-g_min>remax)
                {
                    remax=max.get(i)-g_min;
                    maxp=i-1;
                    minp=max.indexOf(g_min);
                }
            }
                
            
            System.out.println("最大子数组和为是"+(remax-minn)+",位置为("+(minp+1)+","+(maxp+1)+")");
            
            it.close();
        }
    
    }

    实验结果:

    实验过程如上

  • 相关阅读:
    DRF简易了解
    Restful API接口规范
    Python分页
    vue笔记(一)
    CNN实现手写数字识别
    深度学习框架Keras
    NLP自然语言处理
    深度学习框架Tensorflow
    维度的区分
    矩阵求导
  • 原文地址:https://www.cnblogs.com/halone/p/10500507.html
Copyright © 2011-2022 走看看