一个整形数组中最大值求和问题

要求:

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

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

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

当自己看到这个题目的时候,想到了“复杂的问题简单化,一步一步来”,然后在课上老师的引导之下有了自己实现这个功能的方法。最终自己用了两者方法实现功能,但是在第二种方法上花费的时间较多,几乎是第一种方法两倍的时间。下面将两种方法一一解释自己的思路。

一、时间复杂度O(n^2)

本次功能实现简单,一共分为3步,首先是实现数组的输入,然后进行一个或多个连续子数组的求和,最后进行比较。但需要注意的是,求和以及比较是同时存在的。

本次实现功能的过程中遇到了一个小小的问题,就是将自己用来记录最大值的变量f赋初值为0,忽略了数组中的值全为负数时的情况,最终解决将f赋初值为数组中第一个数,解决了问题。

以下是完整代码以及测试结果:

import java.util.Scanner;

public class sum01 {

    public static void main(String[] args) {
        // TODO Auto-generated method stub

        //整形数组的输入
        Scanner sc = new Scanner(System.in);
        System.out.println("请输入数组的长度为:");
        int n=sc.nextInt();
        int[] c = new int[n];
        System.out.println("请输入"+n+"个整数");
        for(int i=0;i<n;i++)
        {
            c[i] = sc.nextInt();
        }

        //子数组求和以及大小比较
        int f=c[0];//定义整形变量f,为子数组最大值
        int sum=0;//定义整形变量sum,为子数组求和
        for (int j=0;j<n;j++)
        {
        for (int i=j;i<n;i++)
        {
            sum=sum+c[i];
            if(f<sum)
            {
                f=sum;//每次求和之后将sum与已有的最大值进行比较
            }
        }
            sum=0;
        }

        System.out.println("该数组的子数组之和的最大值为:"+f);
}

二、时间复杂度O(n)

第二种方案就是实现要求中时间复杂度为O(n)的问题,该程序的设计思想是,从数组中第一个值开始进行加法运算,如果sum值加到某数为负(包括数组中所有整数为负的情况),则将sum值归0(因为数组的子数组为连续,所以sum值可以直接归0),如果sum值大于已有的最大值f,那么给f赋新值sum,如此循环直至数组遍历一遍,最终如果sum不为零,则计算结果就是最大整数,若sum值为0,才需二次遍历数组寻找数组中的最大值。

以下是完整代码以及测试结果:

import java.util.Scanner;

public class sum02 {

    public static void main(String[] args) {
        // TODO Auto-generated method stub
        Scanner sc = new Scanner(System.in);
        System.out.println("请输入数组的长度为:");
        int n=sc.nextInt();
        int[] c = new int[n];
        System.out.println("请输入"+n+"个整数");
        for(int i=0;i<n;i++)
        {
            c[i] = sc.nextInt();
        }

        int f=0;//定义整形变量f,为子数组最大值
        int sum=0;//定义整形变量sum,为子数组求和
        for(int i=0;i<n;i++)
        {
            sum = sum+c[i];
            if(sum < 0)
            {
                sum=0;
            }
            if(sum > f)
            {
                f = sum;
            }
        }

        if(sum == 0)
        {
            for(int i=0;i<n;i++)
            {
                if(i == 0)
                {
                    f = c[i];
                }
                if(f < c[i])
                {
                    f = c[i];
                }
            }
        }

        System.out.println("该数组的子数组之和的最大值为:"+f);

    }

}

此外,在课上还有许多同学提出了自己的观点,首先将数组的最大值找出,然后在围绕最大值进行求和运算的方法也是可行的,但自己还没有用代码进行实现,但同学的设计思路自己已经明白了。

一问多解,像极了自己以前热爱的数学问题,生活中许多问题也是这样,真神奇!

原文地址:https://www.cnblogs.com/Qi77/p/10505647.html

时间: 2024-10-08 20:35:00

一个整形数组中最大值求和问题的相关文章

返回一个整形数组中最大子数组的和

一.要求: 1.要求程序能处理1000个元素 2.每个元素是int32类型的 3.输入一个整形数组,数组里有正数也有负数 4.数组中连续的一个或多个整数组成一个子数组,每个子数组都有一个和 5.求所有子数组的和的最大值.要求时间复杂度为O(n) 二.设计思想 从总左边(a[0])开始遍历整个数组,一直到最右边结束(a[n-1]),在这个过程中记录到目前为止最大的子数组和maxsofar.maxsofar初始化成0.假如我们已经找到a[0]到a[n-1]之间的最大子数组和,那么a[0]到a[i]之

找出一个整形数组中第二大的数字

如何在时间复杂度为O(n)内找出数组中第二大的数字? 通过设置两个变量,一个保存最大值,一个保存第二大值,通过在找最大值的过程中,原来的最大值逐渐变为第二大值.一种实现代码如下(Java版): 1 /** 2 * 在时间复杂度为O(n)内找出数组的第二大的数字 3 * @author JiaJoa 4 * 5 */ 6 public class Algorithm_GetSecondMax { 7 8 public static void main(String[] args) { 9 // T

C语言 有一个整形数组a,有10个元素,要求输出数组中的全部元素

<span style="font-family: Arial, Helvetica, sans-serif; background-color: rgb(255, 255, 255);">有一个整形数组a,有10个元素,要求输出数组中的全部元素</span> 解题思路:引用数组中各元素的值有3种方法:1.下标法,如a[3];2.通过数组名计算数组元素的地址,找出元素的值 3.用指针变量指向数组元素. //用指针变量指向数组元素 #include <std

输入一个整形数组(可能有正数和负数),求数组中连续子数组(最少有一个元素)的最大和。要求时间复杂度为O(n)(解决)

输入一个整形数组(可能有正数和负数),求数组中连续子数组(最少有一个元素)的最大和.要求时间复杂度为O(n). 输入描述: [重要]第一行为数组的长度N(N>=1) 接下来N行,每行一个数,代表数组的N个元素 输出描述: 最大和的结果 输入例子1: 8 1 -2 3 10 -4 7 2 -5 输出例子1: 18 思路:对输入的数组进行计算, import java.util.Scanner; public class Main { public static void main(String[]

3月27号周五课堂练习:结对开发----返回一个整数数组中最大子数组的和三

一.题目要求 1.1输入一个整形数组,数组里有正数也有负数. 1.2数组中连续的一个或多个整数组成一个子数组,每个子数组都有一个和. 1.3如果数组A[0]……A[j-1]首尾相邻,允许A[i-1], …… A[n-1], A[0]……A[j-1]之和最大. 1.4同时返回最大子数组的位置. 1.5求所有子数组的和的最大值.要求时间复杂度为O(n). 二.设计思想 三.源代码 #include<iostream> #include<time.h> #include<conio

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

一 题目要求(合并题目) 1 要求程序必须能处理1000 个元素: 2 每个元素是int32 类型的: 3 输入一个整形数组,数组里有正数也有负数. 4 数组中连续的一个或多个整数组成一个子数组,每个子数组都有一个和. 5 如果数组A[0]……A[j-1]首尾相邻,允许A[i-1], …… A[n-1], A[0]……A[j-1]之和最大. 6 同时返回最大子数组的位置. 7 求所有子数组的和的最大值.要求时间复杂度为O(n). 二 设计思想 将数组和设置为了auto型变量,和的类型会得到调整,

课堂练习2 返回一个整数数组中最大子数组的和。

1.要求程序必须能处理1000个元素:2.每个元素是int32类型的,出现子数组之和大于整型表示的最大范围会出现什么情况:3.输入一个整形数组,数组里面既有正数也有负数:4.数组中连续的一个或多个整数组成一个字数组,每个子数组都有一个和:5.求所有子数组的和的最大值,要求时间复杂度为O(n).设计思想:1.随即生成数组(含有正数和负数).2:求所有子数组,按数组长度进行数组的划分. 计算:从第一个数开始做加法,若和大于第二个数,则继续加下一个数(若加上第三个数的和大于第三个数则重复进行此操作:小

返回一个整数数组中最大子数组的和(一)

要求: 1.输入一个整形数组,数组里有正数也有负数. 2.数组中连续的一个或多个整数组成一个子数组,每个子数组都有一个和. 3.求所有子数组的和的最大值.要求时间复杂度为O(n). 源代码 1 package HomeTest; 2 3 import java.util.ArrayList; 4 import java.util.List; 5 import java.util.Random; 6 7 public class MaxS { 8 public static void main(S

返回一个整数数组中最大子数组的和(1)

题目要求: 输入一个整形数组,数组里有正数也有负数. 数组中连续的一个或多个整数组成一个子数组,每个子数组都有一个和. 求所有子数组的和的最大值.要求时间复杂度为O(n) 发表一篇博客文章讲述设计思想,出现的问题,可能的解决方案(多选).源代码.结果截图.总结. 设计思想及代码和结果截图: 1.最开始的想法很简单,使用穷举法.我们列出所有的子数组之和,然后取出其中的最大值,代码如下: public static void main(String[] args) { int [] a = {1,-