zoukankan      html  css  js  c++  java
  • 整数数组中最大子数组和的问题解决

    一、题目及要求

    1、输入一个整形数组,数组里有正数也有负数。

    2、数组中连续的一个或多个整数组成一个子数组,每个子数组都有一个和。

    3、求所有子数组的和的最大值。要求时间复杂度为O(n)

    二、思路

    这道题我的思路是错的,后来在课上,听了其他两位同学的思路,大致理解了

    大致思路如下:

    1、首先不考虑数组第一个元素,从第二个元素开始,如果第二个元素加一个元素大于第二个元素,

        那么将第二个元素值修改为更大的第一个元素加第二个元素的值,如果第二个元素加一个元素

        小于第二个元素,则第二个元素值不变

    2、依次类推,然后选出经过修改后的数组最大值,即为题目所求

    三、源代码

    package test1;
    
    import java.util.Scanner;
    
    public class Maxsum {
    
        public static void main(String[] args) {
            int a[] = new int [100];
            @SuppressWarnings("resource")
            Scanner sc=new Scanner(System.in);
            System.out.println("请输入数组长度");
            int len = sc.nextInt();
            System.out.println("请输入数组元素");
            for(int i=0;i<len;i++) {
                a[i] = sc.nextInt();
            }
    
            int i=0;
            for(i=1;i<len;i++){
                if(a[i]+a[i-1]>a[i]) {
                    a[i]=a[i]+a[i-1];
                }
            }
            int ans=-100000;
            for(i=0;i<len;i++) {
                if(ans<a[i]) {
                    ans = a[i];
                }
            }
            System.out.println("所有子数组的和的最大值为:"+ans);   
        }
      }

    四、运行截图

    五、加入新条件

    新条件:数组可以首尾相接,并在此基础上求最大子数组和

    六、思路

    1、如果首尾相接后,数组的最大子数组和原来一样,可以按照上面的方法去求

    2、根据网上了解到的算法,如果首尾相接后有最大子数组和,那么这个数组一

    定有最小子数组和,最大子数组和等于所有数组元素的和减去最小子数组和

    七、源代码

    package Test2;
    
    import java.util.Scanner;
    
    public class HuanMax {
        
        public static void main(String[] args) {
            int a[] = new int [100];
            int b[] = new int [100];
            int max = 0;
            int sum = 0;
            @SuppressWarnings("resource")
            Scanner sc=new Scanner(System.in);
            System.out.println("请输入数组长度");
            int len = sc.nextInt();
            System.out.println("请输入数组元素");
            for(int i=0;i<len;i++) {
                a[i] = sc.nextInt();
                b[i] = a[i];
            }
            
            for(int i=0;i<len;i++) {
            sum=sum+a[i];
            }
     
           // System.out.println(sum);
            
            int i=0;
            for(i=1;i<len;i++){
                if(a[i]+a[i-1]>a[i]) {
                    a[i]=a[i]+a[i-1];
                }
            }
            int ans=-100000;
            for(i=0;i<len;i++) {
                if(ans<a[i]) {
                    ans = a[i];
                }
            }
             max=ans;
             
            for(i=1;i<len;i++){
                if(b[i]+b[i-1]<b[i]) {
                    b[i]=b[i]+b[i-1];
                }
            }
            int ans1=100000;
            for(i=0;i<len;i++) {
                if(ans1>b[i]) {
                    ans1 = b[i];
                }
            }
            
            int min=ans1;
            int maxs= sum - min;
            if(maxs>max) {
                System.out.println("所有子数组的和的最大值为:"+maxs);
            }else {
                System.out.println("所有子数组的和的最大值为:"+max);
            }        
       
        } 
    }

    八、运行测试

    九、总结

    总结一下,感觉自己Java语法好多已经忘记,而且对算法掌握的不多,以上两题都是在看了

    别人的思路再自己编程出来的,感觉还是需要补一下算法的知识。

  • 相关阅读:
    Visual Studio DSL 入门 11为状态机设计器添加规则
    不平静的2009,期待更不平静的2010
    ASP.NET MVC 2 正式发布
    [翻译] DSL和模型驱动开发的最佳实践(2/4)
    Visual Studio DSL 入门 9创建状态机的图形符号
    Visual Studio DSL 入门 6DSL的图形表示1
    智诚B2C1.31正式发
    一个程序员的创业尝试
    Visual Studio DSL 入门 13结合T4生成代码
    Visual Studio DSL 入门 10完善状态机案例
  • 原文地址:https://www.cnblogs.com/yang2000/p/12375197.html
Copyright © 2011-2022 走看看