[1124] 表现良好的最长时间段(32)

107 阅读1分钟

这题理解起来太难了,也暴露出 我算法基本功太差了, 船长助教视频看的我蒙死了,又看了n边题解,先找一个比较好理解的,只通过前缀和,能够实现的方法,挨着瞧一遍,硬理解吧.

let addLists = [0];

	// 遍历获取前缀和数组 addLists
	for (let i = 0; i < hours.length; i++) {
		addLists.push(hours[i] > 8 ? addLists[i] + 1 : addLists[i] - 1);//判断大于8则,在上一项的基础上+1,否则就-1
	}

	let result = 0;
	// 双重遍历addLists里面所有i到j的差,找出满足addList[j]-addList[i]>0(良好时间段), 且j-i(下标)跨度最大的,就是最长的表现良好时间
	// 方法一
	for (let i = 0; i < addLists.length; i++) {
		for (let j = i + 1; j < addLists.length; j++) {
			if (addLists[j] - addLists[i] > 0) {
				// 判断满足良好时间(addList[j]-addList[i]>0)段,再和现有的良好时间段的长度比较,取最大值
				result = Math.max(result, j - i)
			}
		}
	}
	// 方法二
	/* for (let i = 0; i < addLists.length; i++) {
		for (let j = 0; j < addLists.length; j++) {
			if (j>i && addLists[j] - addLists[i] > 0) {
				// 判断满足良好时间(addList[j]-addList[i]>0)段,再和现有的良好时间段的长度比较,取最大值
				result = Math.max(result, j - i)
			}
		}
	} */

	return result;