我需要找到總和大于或等于的最小子陣列長度k
。陣列將只有正數。
例如
輸入:
target = 7
,nums = [2,3,1,2,4,3]
輸出:2 解釋:子陣列 [4,3] 在問題約束下具有最小長度。
在我的代碼中,對于 Input: target = 7
,nums = [2,3,1,2,4,3]
我得到的答案是3
,但正確的答案是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;
}
uj5u.com熱心網友回復:
我建議把 outerwhile
變成for
which 可以幫助簡化( Java ) 代碼:
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;
}
uj5u.com熱心網友回復:
推進開始后,您必須在增加之前檢查是否擊中了目標end ;
。您還可以使用 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;
}
uj5u.com熱心網友回復:
您應該對輸入陣列項進行降序排序,然后嘗試您的演算法。
轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/475402.html
上一篇:二維陣列中的單個向量多次
下一篇:返回列表