华为OD统一考试 -找朋友
题目描述
在学校中,N个小朋友站成一队, 第i个小朋友的身高为height[i],
第i个小朋友可以看到的第一个比自己身高更高的小朋友j,那么j是i的好朋友(要求j > i)。
请重新生成一个列表,对应位置的输出是每个小朋友的好朋友位置,如果没有看到好朋友,请在该位置用0代替。
小朋友人数范围是 [0, 40000]。
输入描述
第一行输入N,N表示有N个小朋友
第二行输入N个小朋友的身高height[i],都是整数
输出描述
输出N个小朋友的好朋友的位置
用例
输入 |
2 100 95 |
输出 |
0 0 |
说明 |
第一个小朋友身高100,站在队尾位置,向队首看,没有比他身高高的小朋友,所以输出第一个值为0。 第二个小朋友站在队首,前面也没有比他身高高的小朋友,所以输出第二个值为0。 |
输入 |
8 123 124 125 121 119 122 126 123 |
输出 |
1 2 6 5 5 6 0 0 |
说明 |
123的好朋友是1位置上的124 124的好朋友是2位置上的125 125的好朋友是6位置上的126 以此类推 |
题目解析
感觉很简单,直接双重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
那么如何才能避免重复扫描呢?
此时我们可以利用栈结构
for循环遍历输入数组的每
剩余60%内容,订阅专栏后可继续查看/也可单篇购买
2024华为OD机试卷题 文章被收录于专栏
本专栏给大家提供了华为2024最新华为OD 题目汇总。华为OD机试刷题记录机考算法题库,帮助你上岸华为。提供C++/Java、JavaScript、Python四种语言的解法。