首位相连数组求最大子数组的和

1.设计思路:首先需要定义一个数组,用来存储数值,接着定义一个是上一个数组长度2倍的数组,通过赋值保证原数组能够首尾相连,接着套用求子数组的最大和的方法,不过在求子数组最大和时,必须保证子数组的长度不超过原数组的长度。

2源程序:

package shuzu;

import java.util.Scanner;//循环数组首位相连

public class MAX {
    
    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];
        int array1[]=new int[2*number];
        System.out.println("请输入数组的值");
        for(int i=0;i<number;i++) {
            array[i]=sc.nextInt();
        }//输入数组的值
        int maxsum,maxstart;    
        System.out.println("请输入数组");
        for(int i=0;i<2*number;i++) {
            if(i<number) {
                array1[i]=array[i];
            }else if(i>=number) {
                array1[i]=array[i%number];
            } //保证数组首位相连
            System.out.println("array1[i]"+i+"="+array1[i]);
        }
        maxsum=array1[0];
        maxstart=array1[0];
//        int y=0;
        int start=0;
        for(int i=1;i<2*number-1;i++) {
            if(maxstart<0) {
                maxstart=0;
                start=i;
            }
            maxstart+=array1[i];
            if(maxstart>maxsum) {
                maxsum=maxstart;
            }
            if((i-start+2)>number) {
                break;
            }//判断子数组长度是否大于原数组长度
        }
        System.out.println("最大子数组的和为"+maxsum);
    }
}

3.测试结果:

4自我感想:这道题目是在求子数组的和最大值的改编,其内容基本一致,只是添加了如何让数组首尾相连,一道题目在不同的条件下就可能出现不同的问题,这也需要我们 不断地去思考,去学习。

原文地址:https://www.cnblogs.com/1502762920-com/p/10588201.html