我需要找到总和大于或等于< code>k的最小子阵列长度。数组将只有正数。
例如
输入:< code>target = 7,< code>nums = [2,3,1,2,4,3]输出:2说明:子数组[4,3]在问题约束下长度最小。
在我的代码中,对于输入:< code>target = 7,< code>nums = [2,3,1,2,4,3]我得到的答案是< code>3,但正确答案是< code>2。怎么修?
public int minSubArrayLen(int target, int[] nums) {
int arraySize = nums.length;
int end = 0; // end of subarray
int start = 0; // start of subarray
int minArraySize = Integer.MAX_VALUE;
int sum = 0;
while (end < arraySize) {
sum = sum + nums[end];
if (sum == target) {
minArraySize = Math.min(minArraySize, end - start + 1);
end++;
} else if (sum > target) {
while (sum > target) {
sum = sum - nums[start];
start++;
}
end++;
if (sum == target)
{
minArraySize = Math.min(minArraySize, end - start +1);
}
} else if (sum < target) {
end++;
}
}
return minArraySize;
}
推进开始后,您必须在增加结束之前检查是否击中了traget;
。您还可以使用 goto 避免一些代码重复。
int minSubArrayLen(int target, std:vector<int> nums) {
int arraySize = nums.size();
int end = 0; // end of subarray
int start = 0; // start of subarray
int minArraySize = INT_MAX;
int sum = 0;
while (end < arraySize) {
sum = sum + nums[end];
again:
if (sum == target) {
minArraySize = Math.min(minArraySize, end - start + 1);
} else if (sum > target) {
sum = sum - nums[start];
start++;
goto again;
}
end++;
}
return minArraySize;
}
我建议将时的外部转换为
public int minSubArrayLen(int target, int[] nums) {
//TODO: check for nums == null, target <= 0
int result = 0;
int left = 0;
int sum = 0;
for (int right = 0; right < nums.length; ++right) {
sum += nums[right];
// if sum is large enough we should subtract from the left
while (sum >= target) {
result = result == 0
? right - left + 1
: Math.min(result, right - left + 1);
sum -= nums[left++];
}
}
return result;
}
本文向大家介绍C ++中最小K总和最短的子数组,包括了C ++中最小K总和最短的子数组的使用技巧和注意事项,需要的朋友参考一下 假设我们有一个数组A。我们必须找到A的最短,非空,连续子数组的长度,其总和至少为K。如果没有这样的子数组,则返回-1。 因此,如果输入类似于[5,3,-2,2,1]且k = 6,则输出将为2,如我们所见(5 + 3)> = 6 为了解决这个问题,我们将遵循以下步骤- n:
相关主题: 卡达内算法
子数组包含正数和负数。你必须找到一个最大和子数组,使子数组的长度大于或等于k。 下面是我用C++编写的使用Kadane算法的代码。 我的代码工作得很好,但很慢,我想不出任何方法来改进我的代码。我也读过这个问题,找到最长的子数组,它的和可以被K整除,但这不是我想要的,长度也可以大于K。
给定一个大小为n的非递减数组a和一个整数k,如何找到数组a的一个子序列S,其元素的最大可能和,使得这个和最多为k。如果有多个这样的子序列,我们只想找到一个。 例如,让数组为{1,2,2,4},n=4,k=7。那么,答案应该是{1,2,4}。 蛮力方法大约需要O(n(2^n-1))但是有更有效的解决方案吗?
假设您给出了一个大小为N的数组,它可以有正数和负数。我们需要返回总和的最大子数组的长度等于k。我尝试使用滑动窗口算法,但很快我发现它在这里不起作用,因为数组元素可以有正负整数。 例如: arr=[-20,-38,-4,-7,10,4]和k = 3很明显,有两个可能的子阵列([-4,-7,10,4]和[-7,10]),它们的和等于给定的k。因此输出将是4(最大子阵列的长度) 蛮力方法将采取O(n^2
我想找到给定正整数数组中元素的最大数目,使得它们的和小于或等于给定的k。例如,我有一个数组 答案是3,因为1,2,3是求和6的最大元素。