js(111)~[209] 长度最小的子数组

113 阅读2分钟

209. 长度最小的子数组

image.png

思路一 暴力两层for循环

这道题好像直接刷过也忘记了,但是我知道个暴力循环的解法,写出来经过改正在力扣上面能执行成功,但是提交不了,说超时!这种情况都是代码写的还有问题,简单的数据应该能应付,但是大批量的都不行了,可以说不是最优解!毕竟是自己想出来的,具体记录如下

var minSubArrayLen = function (target, nums) {

	let sum = nums.reduce((a, b) => a + b);
	if (sum < target) {
		return 0;
	}
	let minl = 0;
	for (let i = 0; i < nums.length; i++) {
		const element = nums[i];
		if (element >= target) {
			return 1;
		}

		let sum = element;
		let tminl = 1;
		for (let j = i + 1; j < nums.length; j++) {
			sum = sum + nums[j];
			tminl++;
			if (sum >= target) {
				minl = minl === 0 ? tminl : Math.min(tminl, minl)
				break;
			}
		}
	}

	return minl;

};

现在看看题解,发现我的思路确实没有问题,就是实现上繁杂了一些.优化一下
1 上面临时记录每一个数组长度的变量tminl去掉了 其值用j - i + 1来替代一样的
2 第二个for循环我从i+1开始,但是里面又判断了一层,其实可以直接从j = i,开始,里面也不用在判断了

var minSubArrayLen = function (target, nums) {
//下面判断要不要都行
	/**let sum = nums.reduce((a, b) => a + b);
	if (sum < target) {
		return 0;
	}**/
        
	let minl = 0;
        /
	for (let i = 0; i < nums.length; i++) {
		const element = nums[i];
		if (element >= target) {
			return 1;
		}

		let sum = 0;
		for (let j = i; j < nums.length; j++) {
			sum += nums[j];

			if (sum >= target) {
                        // 出现第一次符合条件的的数组 此时minl = 0的值需要替换成符合条件数组的值,在以后出现符合条件的,就取 已存在的数组和新的数组 最小的长度值 
				minl = minl === 0 ? j - i + 1 : Math.min(j - i + 1, minl)
				break;
			}
		}
	}

	return minl;

};

思路二 滑动窗口

借鉴力扣官方解题思路

image.png

var minSubArrayLen = function (target, nums) {


	let minl = Number.MAX_VALUE;
	let l = r = sum = 0;
	while (r < nums.length) {
		sum += nums[r++];

		while (sum >= target) {
			minl = Math.min(minl, r - l)
			sum -= nums[l++];
		}
	}

	return minl === Number.MAX_VALUE ? 0 : minl;

};

总结, 思路一从起始开始逐个增加后面数字知道满足条件然后记录此数组长度,然后再从下一个开始往后增加找满足条件数组并记录其长度,跟之前记录的对比,直到最后
思路二是我先加到满足条件找到一个数组, 然后开始在这个数组起始去掉一个让他不满足条件,然后不满足条件就继续加后面的数组元素,然后重新判断是否满足条件并且做对应的操作知道最后.

参考链接

leetcode.cn/problems/mi…

leetcode.cn/problems/mi…