一、题目要求

1、输入一个整形数组,数组里有正数也有负数。
2、数组中连续的一个或多个整数组成一个子数组,每个子数组都有一个和。
3、求所有子数组的和的最大值。要求时间复杂度为O(n)

二、设计思想

解决方案一:

1、通过用户输入数组容量,随机产生一个整型数组

2、将数组元素依次相加进行判断,当遇到小于0的数时停止相加(因为要求最大子数组的和,加上小于0的数会让子数组和变小)

3、遍历相加的过程中不断更新子数组的和sum以及最大值max的值

4、遍历完成后输出max值即可

解决方案二:

1、通过用户输入数组容量,随机产生一个整型数组

2、通过循环遍历所有元素求出以该元素为首节点的所有子数组的和,将其存入一个list中

3、求出list的最大值

三、源代码

由于解决方案二的复杂度高于解决方案一,这里只给出解决方案一的代码

  1. public static int getResult(ArrayList<Integer> array) {
  2. int sum = 0;
  3. int result = array.get(0);
  4. for (Integer integer : array) {
  5. if(sum<=0)
  6. sum = integer;
  7. else
  8. sum += integer;
  9.  
  10. if(sum>result)
  11. result = sum;
  12. }
  13. return result;
  14. }

四、扩展

若将原数组首尾相连改为环状数组,求其最大子数组的和解决方案如下:

1、通过用户输入数组容量,随机产生一个整型数组

2、遍历数组中的所有元素,保证让其每个元素都作为一次首节点,将其前面的元素拼到原数组最后使其成为一个新数组

3、对每个新数组求一次最大子数组

4、将所有最大子数组的值比较大小,输出最大值

源代码如下:

  1. import java.util.ArrayList;
  2. import java.util.Scanner;
  3.  
  4. public class FirstTest {
  5.  
  6. public static int getResult(ArrayList<Integer> array) {
  7. int sum = 0;
  8. int result = array.get(0);
  9. for (Integer integer : array) {
  10. if(sum<=0)
  11. sum = integer;
  12. else
  13. sum += integer;
  14.  
  15. if(sum>result)
  16. result = sum;
  17. }
  18. return result;
  19. }
  20.  
  21. public static void main(String[] args) {
  22. Scanner input=new Scanner(System.in);
  23. int num=input.nextInt();
  24. int array[]=new int[num];
  25. ArrayList<Integer> result = new ArrayList<>();
  26.  
  27. for(int i=0;i<num;i++)
  28. {
  29. if((int)(Math.random()*2)==0)
  30. {
  31. array[i]=(int)(Math.random()*10);
  32. }
  33. else
  34. {
  35. array[i]=-(int)(Math.random()*10);
  36. }
  37. }
  38. for(int i=0;i<num;i++) {
  39. System.out.println(array[i]);
  40. }
  41.  
  42. for(int i=0;i<num;i++) {
  43. ArrayList<Integer> list = new ArrayList<>();
  44. for(int j=i;j<num;j++) {
  45. list.add(array[j]);
  46. }
  47. for(int k=0;k<i;k++) {
  48. list.add(array[k]);
  49. }
  50. result.add(getResult(list));
  51. }
  52. int max = result.get(0);
  53. for (Integer integer : result) {
  54. if(max<integer)
  55. max = integer;
  56. }
  57.  
  58. System.out.println(max);
  59. }
  60.  
  61. }

运行结果截图:

  

返回一个整数数组中最大子数组的和——java程序设计的更多相关文章

  1. 软件工程结对开发——返回一个整数数组中最大子数组的和(JAVA)

    题目:返回一个整数数组中最大子数组的和. 要求: 输入一个整型数组,数组里有正数也有负数: 数组中连续的一个或多个整数组成一个子数组,每个子数组都有一个和: 求所有子数组的和的最大值.要求时间复杂度为 ...

  2. 使用jQuery匹配文档中所有的li元素,返回一个jQuery对象,然后通过数组下标的方式读取jQuery集合中第1个DOM元素,此时返回的是DOM对象,然后调用DOM属性innerHTML,读取该元素 包含的文本信息

    <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/ ...

  3. 求一个数组的最大子数组(C/C++实现)

    最大子数组:要求相连,加起来的和最大的子数组就是一个数组的最大子数组.编译环境:VS2012,顺便说句其实我是C#程序员,我只是喜欢学C++. 其实这是个半成品,还有些BUG在里面,不过总体的思路是这 ...

  4. 4.产生10个1-100的随机数,并放到一个数组中 (1)把数组中大于等于10的数字放到一个list集合中,并打印到控制台。 (2)把数组中的数字放到当前文件夹的numArr.txt文件中

    package cn.it.text; import java.io.FileWriter; import java.io.IOException; import java.util.ArrayLis ...

  5. Task 4.3 求环形数组的最大子数组和

    任务要求:输入一个整形数组,数组里有正数也有负数. 数组中连续的一个或多个整数组成一个子数组,每个子数组都有一个和.    如果数组A[0]……A[j-1]首尾相邻,允许A[i-1], …… A[n- ...

  6. 字串符相关 split() 字串符分隔 substring() 提取字符串 substr()提取指定数目的字符 parseInt() 函数可解析一个字符串,并返回一个整数。

    split() 方法将字符串分割为字符串数组,并返回此数组. stringObject.split(separator,limit) 我们将按照不同的方式来分割字符串: 使用指定符号分割字符串,代码如 ...

  7. 求解数组环中最大子数组和的问题(java)

    //石家庄铁道大学 信1405-1 班 唐炳辉 在上一次作业中,对于普通数组的最大子数组的求解问题的基础上,将普通的数组变成一个首尾相接的环,求这个环的最大子数组.类似的,只要改变普通数组的数组位置, ...

  8. [Jobdu] 题目1527:首尾相连数组的最大子数组和

    题目描述: 给定一个由N个整数元素组成的数组arr,数组中有正数也有负数,这个数组不是一般的数组,其首尾是相连的.数组中一个或多个连续元素可以组成一个子数组,其中存在这样的子数组arr[i],…arr ...

  9. 蚂蚁的难题(二)首尾相连数组的最大子数组和(DP)

    蚂蚁的难题(二) 时间限制:1000 ms  |  内存限制:65535 KB 难度:3 描述 下雨了,下雨了,蚂蚁搬家了. 已知有n种食材需要搬走,这些食材从1到n依次排成了一个圈.小蚂蚁对每种食材 ...

随机推荐

  1. python HelloWorld 的 4 种姿势,你知道几种

    安装完 Python 之后该干啥,当然是要 say HelloWorld 了. python.exe 就是个普通程序 和其它所有命令一样,在命令行中敲下 python 并回车的时候,操作系统去 PAT ...

  2. Vmware14 开机黑屏或者以独占方式锁定此配置文件失败等问题解决办法

    把VMware14版本卸载掉,然后重装一个12版本的 打开之前创建的虚拟机,提示版本不兼容, 打开配置文件: 修改版本为重装的版本,比如12 然后编辑虚拟机设置指定一个系统,比如centos,即可 就 ...

  3. Leetcode 题目整理-3 Palindrome Number & Roman to Integer

    9. Palindrome Number Determine whether an integer is a palindrome. Do this without extra space. clic ...

  4. AcWing 789.数的范围

    AcWing 789.数的范围 题目描述 给定一个按照升序排列的长度为n的整数数组,以及 q 个查询. 对于每个查询,返回一个元素k的起始位置和终止位置(位置从0开始计数). 如果数组中不存在该元素, ...

  5. Hello,world!一切的开始

    普及知识 当我们准备开发Java程序时,我们需要两样基础的工具--JDK与IDE.在这里需要解释一下什么是JDK还有IDE.JDK的全称是Java Development kit,即Java开发工具集 ...

  6. 微信小程序 npm 找不到npm包 没有找到可以构建的npm包 如何使用第三方npm组件

    微信官方的npm文档 太模糊了,而且感觉把最重要的东西写在了最后面,我这里费了老大功夫才知道这个坑. 初次使用,首先要初始化 npm 初始化——> 找到 pages 这个文件夹,然后进入这个文件 ...

  7. 最简单的基于FFMPEG+SDL的视频播放器:拆分-解码器和播放器

    ===================================================== 最简单的基于FFmpeg的视频播放器系列文章列表: 100行代码实现最简单的基于FFMPEG ...

  8. 每日一练_PAT_B_PRAC_1004客似云来

    题目描述 NowCoder开了一家早餐店,这家店的客人都有个奇怪的癖好:他们只要来这家店吃过一次早餐,就会每天都过来:并且,所有人在这家店吃了两天早餐后,接下来每天都会带一位新朋友一起来品尝.于是,这 ...

  9. pyspark 记录

    import os import sys spark_name = os.environ.get('SPARK_HOME',None) if not spark_name: raise ValueEr ...

  10. ARTS Week 3

    Nov 11,2019 ~ Nov 17,2019 Algorithm 本周来介绍快速求一个数字n次方的余数. 理论基础 我们先定义运算$ x \bmod p = r \(与\) x \equiv r ...