输入一个整形数组(可能有正数和负数),求数组中连续子数组(最少有一个元素)的最大和。要求时间复杂度为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[] args){
  Scanner in = new Scanner(System.in);
  int inputSize = in.nextInt();
  int[] array = new int[inputSize];

  for(int i=0;i<array.length;i++){
  array[i] = in.nextInt();
  }

  System.out.println(findMax(array,array[0]));

}

public static int findMax(int[]array,int maxSum){
  int localSum = 0;//存储当前的可能是目标子集的元素和
  int inputSize = array.length;
  for(int i =0;i<inputSize;i++){

  if(array[i]>0){//如果当前的元素大于0,则把它的值加入当前目标子集的和
    if(localSum<0){//如果localSum小于0,那么当前的子集必然不会构成目标子集
    localSum=0;
  }
  localSum+=array[i];
  }else {//如果当前的元素小于0,则要判断localSum是否大于0,如果大于0,则加入当前元素值(因为之后可能仍然有很大的数)
    if(localSum>0){
    localSum+=array[i];

    }else{//如果localSum小于0,说明之前的一些元素有比较大的负数,那么就从当前位置开始重新寻找,
      localSum = array[i];

    }
  }

  if(maxSum < localSum){
  maxSum = localSum;
  }
  }

  return maxSum;
  }

}


免责声明!

本站转载的文章为个人学习借鉴使用,本站对版权不负任何法律责任。如果侵犯了您的隐私权益,请联系本站邮箱yoyou2525@163.com删除。



猜您在找 输入一个整形数组,数组里有正数也有负数。 数组中连续的一个或多个整数组成一个子数组,每个子数组都有一个和。 求所有子数组的和的最大值。要求时间复杂度为O(n) 输入一个整型数组,数据元素有正数也有负数,求元素组合成连续子数组之和最大的子数组,要求时间复杂度为O(n)。 [java实现]找一个数组的最大和的连续子数组(时间复杂度 O(n)) Leetcode练习(Python):数组类:第53题:给定一个整数数组 nums ,找到一个具有最大和的连续子数组(子数组最少包含一个元素),返回其最大和。进阶: 如果你已经实现复杂度为 O(n) 的解法,尝试使用更为精妙的分治法求解。 Leetcode练习(Python):数组类:第128题:给定一个未排序的整数数组,找出最长连续序列的长度。 要求算法的时间复杂度为 O(n)。 一个整形数组中有正数也有负数,数组中连续一个或多个组成子数组,每个子数组都有一个和,求所有子数组中和的最大值 给定一个长度为N的数组,找出出现次数大于n/2,n/3的数,要求时间复杂度O(n),空间复杂度O(1) 两个有序数组合并成一个有序数组(要求时间复杂度为O(n)) Leetcode练习(python):第414题:第三大的数:给定一个非空数组,返回此数组中第三大的数。如果不存在,则返回数组中最大的数。要求算法时间复杂度必须是O(n)。 给定一个整数数组 nums 和一个目标值 k,请实现一个方法判断 nums 中是否存在某个片段(即若干个相连元素)之和等于 k。要求时间复杂度为 O(n)。
 
粤ICP备18138465号  © 2018-2025 CODEPRJ.COM