题目解析
感觉很简单,直接双重for,逻辑如下
/* 记录前面出现的第一个比自己高的人的序号 */
function getHigherIndex(arr) {
let higherIndex = arr.slice().fill(0);
for (let i = 0; i < arr.length - 1; i++) {
for (let j = i + 1; j < arr.length; j++) {
if (arr[j] > arr[i]) {
higherIndex[i] = j;
break;
}
}
}
return higherIndex;
}
但是时间复杂度是O(n^2)。那么是不是有优化的可能呢?
下面图示中,我们蓝色的是i指针,橙色的是j指针,我么们可以发现j指针的扫描过程存在重复,比如:
- i=2时,j从121扫描到了126,将扫描过程中j指向的每一个数都和i指向的125进行了比较。
- i=3时,j又扫描了一遍119,122;
- i=4时,j又扫描了一遍122
- i=5时,j又扫描了一遍126
那么如何才能避免重复扫描呢?