例如, {1, 4, 45, 6, 0, 19}
号码呢 51
你应该回来 3
,因为最小子数组中的元素数加起来大于 51
是 3:
{4,45,6}.
{7, 2, 5, 10, 1}号码呢
9你应该回来
1,因为最小子数组中的元素数可能大于
9是
{10}` .
如果数组为null或空,或者数组没有大于给定数字的子数组,则该方法必须返回-1。我不允许使用java.util中的数组包。我的目标是在o(n)时间内执行该方法。这是到目前为止我的代码,如果数组没有大于给定数字的子数组,它将返回outofbounds错误。有人有线索吗?
public static int smallestSubSum(int arr[], int x) {
int left = 0, right = 1, smallest = 0;
int sum = arr[right];
for (int i = 1; i < arr.length; i++) {
if (sum > x)
smallest = left - right;
else
right++;
sum += arr[right];
if (sum > x && left - right < smallest) {
smallest = left - right;
left++;
} else
sum -= arr[left];
left++;
if (sum > x && left - right < smallest)
smallest = left - right;
}
return smallest;
}
编辑:也许我应该解释一下我试图用我的代码做什么,基本上我想让总和包含代码中的前两个元素,然后与每个“如果”迭代进行比较如果当前元素的总和大于或小于x,如果不是,我提高右边的元素更进一步,如果是,我删除第一个元素,左边的元素。
{1,4,45,6,0,19}和数字51的数组返回2,即使结果应该是3。我不知道为什么,因为我的右边达到了索引3,它是6,左边达到了索引1,它是4,所以结果应该是{4,45,6},但它没有达到它。
1条答案
按热度按时间hjqgdpho1#
这是我能做的最好的了。
这是我的测试结果。
我只是用一个
for
循环。每当总数超过x值时,我就减去值,直到总数降到x值以下。下面是我测试的完整可运行代码。