整数数组中最大子数组和的问题解决

一、题目及要求

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语法好多已经忘记,而且对算法掌握的不多,以上两题都是在看了

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

猜你喜欢

转载自www.cnblogs.com/yang2000/p/12375197.html