java切片占用大量内存_java – 最大双切片总和

本文探讨了Codility中MaxDoubleSliceSum问题的解决方案。该问题是MaxSlice问题的一个变种,旨在找出数组中双切片的最大和。文章详细介绍了作者的实现思路与遇到的问题,并寻求更优解。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

最近,我尝试解决codility中的Max Double Slice Sum问题,这是max slice问题的变体.我的解决方案是在取出最小值时查找具有最大值的切片.所以我实现了最大切片,但是在当前切片上取出了最小数量.

我的得分为61分,因为在一些测试中失败了,主要是阵列上的测试,包括负数和位置数.

你能帮我弄清楚代码失败的原因或者是否有更好的解决方案?

问题如下:

A non-empty zero-indexed array A consisting of N integers is given.

A triplet (X, Y, Z), such that 0 ≤ X < Y < Z < N, is called a double slice.

The sum of double slice (X, Y, Z) is the total of A[X + 1] + A[X + 2] + ... + A[Y − 1]+ A[Y + 1] + A[Y + 2] + ... + A[Z − 1].

For example, array A such that:

A[0] = 3

A[1] = 2

A[2] = 6

A[3] = -1

A[4] = 4

A[5] = 5

A[6] = -1

A[7] = 2

contains the following example double slices:

double slice (0, 3, 6), sum is 2 + 6 + 4 + 5 = 17,

double slice (0, 3, 7), sum is 2 + 6 + 4 + 5 − 1 = 16,

double slice (3, 4, 5), sum is 0.

The goal is to find the maximal sum of any double slice.

Write a function:

class Solution { public int solution(int[] A); }

that, given a non-empty zero-indexed array A consisting of N integers, returns the maximal sum of any double slice.

For example, given:

A[0] = 3

A[1] = 2

A[2] = 6

A[3] = -1

A[4] = 4

A[5] = 5

A[6] = -1

A[7] = 2

the function should return 17, because no double slice of array A has a sum of greater than 17.

Assume that:

N is an integer within the range [3..100,000];

each element of array A is an integer within the range [−10,000..10,000].

Complexity:

expected worst-case time complexity is O(N);

expected worst-case space complexity is O(N), beyond input storage (not counting the storage required for input arguments).

Elements of input arrays can be modified.

Copyright 2009–2013 by Codility Limited. All Rights Reserved. Unauthorized copying, publication or disclosure prohibited.

我的代码如下:

public class Solution {

public int solution(int[] A) {

int currentSliceTotal=0;

Integer currentMin=null, SliceTotalBeforeMin =0;

int maxSliceTotal= Integer.MIN_VALUE;

for(int i= 1; i

if( currentMin==null || A[i] < currentMin ){

if(currentMin!=null ){

if(SliceTotalBeforeMin+currentMin <0){

currentSliceTotal-=SliceTotalBeforeMin;

} else {

currentSliceTotal += currentMin;

}

}

currentMin = A[i];

SliceTotalBeforeMin =currentSliceTotal;

if( SliceTotalBeforeMin<0){

SliceTotalBeforeMin = 0;

currentMin = null;

currentSliceTotal = 0;

}

} else {

currentSliceTotal+= A[i];

}

maxSliceTotal = Math.max(maxSliceTotal, currentSliceTotal);

}

return maxSliceTotal;

}

}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值