用暴力法解,java超时了,js没有超时,如下第一个就是用js暴力解的。
而后用js代码写滑动窗口的方式解题,效率比暴力解提升了近一千倍。
要确认窗口范围,还需要确认所求的结果!
暴力解法
class Solution {
public int minSubArrayLen(int target, int[] nums) {
int ans = Integer.MAX_VALUE;
for (int i = 0; i < nums.length; i++) {
int sum = nums[i];
if (sum >= target) {
return 1;
}
for (int j = i + 1; j < nums.length; j++) {
sum += nums[j];
if (sum >= target) {
ans = Math.min(ans, j - i + 1);
break;
}
}
}
return ans == Integer.MAX_VALUE ? 0 : ans;
}
}
两次质量的比较
/**
* 209. 长度最小的子数组
*
* 通过,但效率很差
* 执行用时:6660 ms, 在所有 JavaScript 提交中击败了5.04%的用户
* 内存消耗:45.3 MB, 在所有 JavaScript 提交中击败了24.23%的用户
* 通过测试用例:
* 20 / 20
*
* @param {number} target
* @param {number[]} nums
* @return {number}
*/
var minSubArrayLen = function (target, nums) {
let min = Number.POSITIVE_INFINITY
for (let i = 0; i < nums.length; i++) {
let sum = nums[i]
if (sum >= target) {
return 1
}
for (let j = i + 1; j < nums.length; j++) {
sum += nums[j]
if (sum >= target) {
min = Math.min(min, j - i + 1)
break
}
}
}
return min === Number.POSITIVE_INFINITY ? 0 : min
};
/**
* 209. 长度最小的子数组
*
* 通过,效率提升近一千倍
* 执行用时:64 ms, 在所有 JavaScript 提交中击败了82.24%的用户
* 内存消耗:45.2 MB, 在所有 JavaScript 提交中击败了41.82%的用户
* 通过测试用例:
* 20 / 20
*
* @param {number} target
* @param {number[]} nums
* @return {number}
*/
var minSubArrayLen2 = function (target, nums) {
let min = Number.POSITIVE_INFINITY
let sum = 0
let i = 0
for (let j = 0; j < nums.length; j++) {
sum += nums[j]
while (sum >= target) {
min = Math.min(min, j - i + 1)
sum -= nums[i++]
}
}
return min === Number.POSITIVE_INFINITY ? 0 : min
};