zoukankan      html  css  js  c++  java
  • 求整数数组中所有子数组的和的最大值

    题目:求整数数组中所有子数组的和的最大值

    要求:

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

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

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

    思路:(参考王正帅的)

      首先数组中的第一个数自己是一个数组,

      然后从第二个开始,每个数有两种隶属可能:

          1.和前边的子数组是一个数组,如果当前数加上前边数组的和,加起来大于当前数。

          2.自己是一个新的数组,如果当前数加上前边数组的和,加起来小于当前数。

      然后遍历一遍数组,将所有可能是最大子数组的子数组和存到相应子数组的最后一个位置。

      最后遍历,得出最大的子数组和。

    代码:(参考王正帅

    package com.me.array;
    
    import java.util.Scanner;
    
    public class ArrayMax {
        
        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("请输入"+len+"个数字");
            for(int i=0;i<len;i++) {
                a[i] = sc.nextInt();
            }
            int max = maxSubSum(a,len);
            System.out.println("所有子数组的和的最大值为:"+max);
            
        }
        static int maxSubSum(int[] a,int length) {
            int i=0;
            int len = length;
            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];
                }
            }
            return ans;
        } 
    }

    运行的结果:

    总结:

    真的是很久没练习java了,上个学期全都学习javaweb了,也就忽略了java的基础思维了。所以以后一定要多加练习才是。

  • 相关阅读:
    linux 内核升级4.19
    监管对保险页面的要求
    软件测试-测试可交付成果
    软件测试架构思想
    dockerfile
    转载:.NET Core 图片操作在 Linux/Docker 下的坑
    docker build速度过慢问题
    .net 5 发布到 docker 或 docker 镜像方法
    Centos 安装 docker 教程
    DQL、DML、DDL、DCL全名是啥?
  • 原文地址:https://www.cnblogs.com/022414ls/p/13061232.html
Copyright © 2011-2022 走看看