这题理解起来太难了,也暴露出 我算法基本功太差了, 船长助教视频看的我蒙死了,又看了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;