zoukankan      html  css  js  c++  java
  • 返回一个整型数组中最大子数组的和(1)

    1.题目1:返回一个整数数组中最大子数组的和。

    要求:

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

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

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

    2.设计思想:

    1.首先从数组array[num]下标 i=0 开始,进行元素循环相加,与此同时,每一次相加之后与最大值max进行比较,最大值起初赋值为array[i]。

    2.把每一轮的最大值用数组m[num]存放起来。

    3.最后循环遍历输出m[num]数组的最大值。

    3.程序源代码:

    import java.util.*;
    public class sonarr {
    public static void main(String[] args) {
        Scanner input=new Scanner(System.in);
        System.out.print("数组中数的个数:");
        int num=input.nextInt();
        int array[]=new int[num];
        for(int i=0;i<num;i++)
        {
                array[i]=input.nextInt();
        }
        int max=0;
    //    m数组是存放每一轮子数组最大值
        int m[]=new int[num];
        for(int j=0;j<num;j++)
        {
            max=array[j];
            int sum=0;
            for(int t=j;t<num;t++)
            {
                sum=sum+array[t];
                if(sum>max)
                {
                    max=sum;
                }
            }
            m[j]=max;
        }
        for(int i=0;i<num;i++)
        {
            System.out.print("第"+(i+1)+"次比较的子数组的和的最大值为:");
            System.out.println(m[i]);
        }
        for(int i=1;i<num;i++)
        {
            max=m[0];
            if(m[i]>max)
            {
                max=m[i];
            }
        }
        System.out.print("子数组和的最大值为:"+max);
    }
    }

    4.运行结果截图:

    5.题目升级:如果在原来基础上把整型一维数组变成循环数组,那么结果又是怎样的呢?

    要求:数组中的数只用一次!!

    6.设计思想:

    1.既然是循环数组,那么就必须控制数组下标可以回到起始值且小于起始值。

    2.所以加一个if语句就可以了。

    7.程序源代码:

    import java.util.Scanner;
    public class sonarr1 {
    public static void main(String[] args) {
        Scanner input=new Scanner(System.in);
        System.out.print("数组中数的个数:");
        int num=input.nextInt();
        int array[]=new int[num];
        for(int i=0;i<num;i++)
        {
                array[i]=input.nextInt();
        }
        int max=0;
        int m[]=new int[num];
        for(int j=0;j<num;j++)
        {
            max=array[j];
            int t=0;
            int sum=0;
            for(t=j;t<num;t++)
            {
                sum=sum+array[t];
                if(sum>max)
                {
                    max=sum;
                }
                if(t==num-1) {
                    for(int y=0;y<j;y++)
                    {
                        sum=sum+array[y];
                        if(sum>max)
                        {
                            max=sum;
                        }
                    }}
                
            }
            m[j]=max;
        }
        for(int i=0;i<num;i++)
        {
            System.out.print("第"+(i+1)+"次比较的子数组的和的最大值为:");
            System.out.println(m[i]);
        }
        for(int i=1;i<num;i++)
        {
            max=m[0];
            if(m[i]>max)
            {
                max=m[i];
            }
        }
        System.out.print("子数组和的最大值为:"+max);
    }
    }

    8.运行结果截图:

  • 相关阅读:
    ZOJ 1060 Count the Color
    POJ 3321 Apple Tree
    数字三角形模型
    静态维护区间加等差数列的求和问题
    Codeforces Round #622 (Div. 2)-题解
    算法竞赛进阶指南0x00-算法基础
    Codeforces Round #628 (Div. 2)
    Codeforces Round #625 (Div. 2, based on Technocup 2020 Final Round)
    Codeforces Round #621 (Div. 1 + Div. 2)
    Codeforces Round #620 (Div. 2) 题解
  • 原文地址:https://www.cnblogs.com/a155-/p/12362954.html
Copyright © 2011-2022 走看看