连续子数组的最大和python_求连续子数组的最大和

2

这题最操蛋的是,输入竟然是一个字符串,但是又没有说明。 import java.util.*;

/*

数组的子数组最大和问题

从前向后累加,每累加一个判断是否是新的最大值

若累加值<=0,说明左边的数组对右边的数组继续累加没有意义,则重新开始累加

比如1,2,-4,5,6这样一个数组

累加到1时,最大和为1

累加到2时,最大和为3

累加到-4时,结果为-1,最大和仍为3,但由于左边三个数之和为-1,右边的子序列包括这一段不能使和更大,

因此从5开始重新累加

最终最大子序列和为11

*/

public class Main {

public static void main(String[] args) {

Scanner scanner = new Scanner(System.in);

String inputStr = scanner.next();

String[] inputStrs = inputStr.split(",");

long sum = 0;

long max = 0;

for (String str : inputStrs) {

long num = Integer.parseInt(str);

sum += num;

max = max > sum ? max : sum;

sum = sum < 0 ? 0 : sum;

}

System.out.println(max);

}

}

编辑于 2020-02-17 12:59:50

回复(2)

2

```java

import java.io.BufferedReader;

import java.io.IOException;

import java.io.InputStreamReader;

public class Solution17_求连续子数组的最大和 { public static void main(String[] args) throws IOException {

BufferedReader bf = new BufferedReader(new InputStreamReader(System.in));

String[] line1 = bf.readLine().split(",");

int[] nums = new int[line1.length];

for (int i = 0; i < line1.length; i++) {

nums[i] = Integer.parseInt(line1[i]);

}

int max = Integer.MIN_VALUE, cur_sum = 0;

for (int i = 0; i < nums.length; i++) {

//如果当前累计的和比0还小,直接抛弃,一个数加上一个负数肯定比原来小,直接取当前数

if (cur_sum <= 0) {

cur_sum = nums[i];

} else {

cur_sum += nums[i];

}

//更新最大值

if (max < cur_sum) {

max = cur_sum;

}

}

System.out.println(max > 0 ? max : 0);

}

}```

发表于 2019-08-05 15:09:34

回复(0)

2

a=input().split(',')

maxm=num=0

for j in a:

num=num+int(j) if num+int(j)>0 else 0#如果当前和非负则保留,为负则舍弃

maxm=max(maxm,num)

print(maxm)

编辑于 2019-12-26 14:02:52

回复(0)

1

比较朴素的做法

#include

#include 

using namespace std;

int main(){

string str;

cin >> str;

int k;

vector arr;

while((k = str.find(',')) != str.npos){

string temp = str.substr(0, k);

arr.push_back(stoi(temp));

str = str.substr(k + 1);

}

arr.push_back(stoi(str));

int tempmax = 0;

int realmax = arr[0];

for(int i = 0; i 

if(arr[i] <0){

tempmax = arr[i];

}

else{

tempmax += arr[i];

if(tempmax <= 0){

tempmax = arr[i];

}

}

if(tempmax > realmax){

realmax = tempmax;

}

}

if(realmax <= 0){

cout <

}

else{

cout <

}

return 0;

}

编辑于 2020-05-17 12:00:37

回复(0)

1

贪心算法,线性时间复杂度

import java.util.*;

public class Main{

private static Scanner sc;

public static void main(String[] args){

sc = new Scanner(System.in);

while(sc.hasNext()){

int[] nums = readin();

int res = nums[0];

int tmax = nums[0];

for(int i = 1;i

tmax = Math.max(tmax+nums[i],nums[i]);

res = Math.max(res,tmax);

}

if(res > 0)

System.out.println(res);

else

System.out.println(0);

}

}

private static int[] readin(){

String[] in = sc.nextLine().split(",");

int[] res = new int[in.length];

for(int i = 0;i

res[i] = Integer.parseInt(in[i]);

return res;

}

}

发表于 2020-03-04 01:01:49

回复(0)

1

#include 

using namespace std;

int main(){

int x;

vector a;

while(cin>>x){

a.push_back(x);

char c = getchar();

if(c=='\n')

break;

}

int Max=0, s = 0;

for(int i=0;i

if(s+a[i]<0)

s = 0;

else{

s += a[i];

Max = max(Max,s);

}

}

cout<

return 0;

}

发表于 2019-11-29 12:43:53

回复(0)

1

动态规划求解:

int max(int n,int *a)

int sum=0;

int b=0;

for(int i=1;i《n;i++)

if(b》0)

b+=a【i】;

else

b=0;

if(sum《b)

sum=b;

if(sum》0)

printf(sum);

else

printf(0);

发表于 2019-10-12 20:55:29

回复(0)

1

#include

using namespace std;

int main() {

int ans = 0;

int sum = 0;

int tempValue = 0;

while (~scanf("%d%c",&tempValue))

{

sum += tempValue;

if (sum < 0)

sum = 0;

if (sum > ans)

ans = sum;

}

cout << ans<< endl;

}

发表于 2019-10-04 03:24:42

回复(0)

1

#include 

using namespace std;

int main(){

int n,sum,maxsum=0;

vector arr;

arr.reserve(10000);

while(scanf("%d,",&n)>0)

arr.push_back(n);

sum=arr[0];

maxsum=max(sum,maxsum);

for(int i=1;i

if(sum+arr[i]<0)

sum=0;

else{

sum+=arr[i];

maxsum=max(maxsum,sum);

}

cout<

return 0;

}

发表于 2019-09-19 21:08:58

回复(0)

1

"""

最大子段和问题

ans[i]记录以i结尾的最大子段和

"""

import sys

if __name__ == "__main__":

# sys.stdin = open("input.txt", "r")

a = list(map(int, input().strip().split(',')))

ans = [0]

temp = 0

for c in a:

temp = max(0, temp) + c

ans.append(temp)

print(max(ans))

发表于 2019-07-10 12:27:18

回复(0)

1

编辑于 2018-11-08 00:17:06

回复(1)

0

import java.util.*;

public class Main{

public static void main(String[] args){

Scanner sc = new Scanner(System.in);

String inputStr = sc.next();

String[] inputStrs = inputStr.split(",");

long cur = 0;

long maxSum = Integer.MIN_VALUE;

for(String str : inputStrs){

long num = Integer.parseInt(str);

cur = Math.max(cur + num, num);

maxSum = Math.max(maxSum, cur);

}

long res =  maxSum > 0 ? maxSum : 0;

System.out.println(res);

}

}

发表于 2020-10-11 17:07:26

回复(0)

0

import java.util.*;

public class Main {

public static void main(String[] args) {

Scanner sc = new Scanner(System.in);

String s = sc.nextLine();

String[] ss = s.split(",");

int[] nums = new int[ss.length];

for(int i = 0; i 

nums[i] = Integer.parseInt(ss[i]);

int ans = maxSum(nums);

System.out.println(ans);

}

private static int maxSum(int[] nums){

int max = 0;

int cur = 0;

for(int num : nums){

cur = Math.max(cur,0);

cur += num;

max = Math.max(cur,max);

}

return max > 0 ? max : 0;

}

}

发表于 2020-06-28 00:17:31

回复(0)

0

import sys

in_num = sys.stdin.readline().strip().split(',')

num = [int(i) for i in in_num]

res = []

for length in range(len(num), 0, -1):

for i in range(len(num) - length + 1):

now_num = num[i:i + length]

res.append(sum(now_num))

final_res = max(res)

if final_res 

print(0)

else:

print(final_res)

发表于 2020-06-11 17:19:26

回复(0)

0

import java.util.ArrayList;

import java.util.Arrays;

import java.util.HashMap;

import java.util.LinkedList;

import java.util.Map;

import java.util.Queue;

import java.util.Scanner;

import java.util.Stack;

public class Main {

public static void main(String[] args) {

Scanner sc = new Scanner(System.in);

String str = sc.nextLine();

String[] strmun = str.trim().split(",");

//    System.out.println(""+Arrays.toString(strmun)+" "+strmun.length);

int[] dp=new int[strmun.length];

int i;

dp[0]=Integer.valueOf(strmun[0]);

for(i=1;i

if(Integer.valueOf(strmun[i])>=(dp[i-1]+Integer.valueOf(strmun[i]))) {

dp[i]=Integer.valueOf(strmun[i]);

}else {

dp[i]=(dp[i-1]+Integer.valueOf(strmun[i]));

}

}

Arrays.sort(dp);

if(dp[i-1]<=0) {

System.out.println("0");

}else {

System.out.println(dp[i-1]);

}

//System.out.println(""+Arrays.toString(dp)+" dp");

}

}

发表于 2020-05-31 10:29:13

回复(0)

0

#include

(720)#include

using namespace std;

int main(void){

string s;

cin>>s;

vector v;

int k;

while ((k = s.find(',')) != s.npos){

string temp = s.substr(0, k);

v.push_back(stol(temp));

s = s.substr(k+1);

}

v.push_back(stol(s));

vector dp(v.size());

long MaxAns = 0;

for (int i = 0; i 

if (i == 0)

dp[i] = v[i];

else{

if (dp[i-1] >= 0)

dp[i] = dp[i-1] + v[i];

else

dp[i] = v[i];

}

MaxAns = max(dp[i], MaxAns);

}

cout<

return 0;

}

发表于 2020-05-08 16:02:55

回复(0)

0

测试程序有问题,自测通过但提交未通过 #include

#include

#include

using namespace std;

int main() {

vector vec;

int num;

while (cin >> num) {

vec.push_back(num);

}

vector dp(vec.size(), 0);

dp[0] = vec[0];

for (int i = 1; i < vec.size(); i++) {

dp[i] = max(dp[i - 1] + vec[i], 0);

}

cout << dp[vec.size() - 1] << endl;

return 0;

}

编辑于 2020-04-23 22:57:32

回复(0)

0

O(1) space solution #include

#include

#include

#include

using namespace std;

int main(int argc, char* argv[]){

string str;

cin >> str;

for(int idx = 0; idx < str.length(); idx++){

if(str[idx] == ',') str[idx] = ' ';

}

stringstream ss(str);

int val, sum = 0, largest = 0;

while(ss >> val) {

sum += val;

if(val >= sum){

sum = val;

}

largest = max(largest, sum);

}

cout << largest << endl;

return 0;

}

编辑于 2020-04-10 15:52:44

回复(0)

0

var arr=readline().split(',').map(Number);

var len=arr.length;

var max=0;

// 第一层是窗口大小,第二层是起始索引

for(var i=1;i<=len;i++){

for(var j=0;j<=len-i;j++){

if(i>1){

var tem=arr.slice(j,j+i).reduce((a,b)=>{

return a+b

})

}else{

var tem=arr[j]

}

max=tem>max?tem:max;

}

}

console.log(max)

发表于 2020-04-01 00:03:55

回复(0)

0

// 要注意这两个位置可以是同一个位置,否则只能 AC 83%

public class Main {     public static void main(String[] args) {

Scanner in = new Scanner(System.in);

String[] a = in.next().split(",");

System.out.println(ans(a));

}

private static int ans(String[] a) {

int n = a.length;

if(n==1) {

return a[0].startsWith("-") ? 0 : Integer.parseInt(a[0]);

}

int res = 0;

int dp[][] = new int[n][n];

for(int i=0;i

for(int j=i;j

int sum = 0;

if(i==j) {

sum = Integer.parseInt(a[i]);

} else if(i==j-1) {

sum = Integer.parseInt(a[i]) + Integer.parseInt(a[j]);

} else {

sum = dp[i][j-1] + Integer.parseInt(a[j]);

}

res = Math.max(res, sum);

dp[i][j] = sum;

}

}

return (res>0) ? res : 0;

}

}

发表于 2020-03-16 23:23:52

回复(0)

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值