关注
第三题我完全参考了檐之同学的思路,可以把算法复杂度从O(n2)降到O(n)。附上原作者的链接:https://www.nowcoder.com/discuss/226305?type=post&order=time&pos=&page=1 申请两个数组,lookBackward[i]表示向坐标递减的方向看时,在i位置能看到的楼的个数;lookForward[i]表示向坐标递增的方向看时,在i位置能看到的楼的个数。用栈的size记录楼的个数,若栈顶楼高小于等于当前遍历到的楼高则pop栈顶,否则直接push新楼。 很巧妙的地方是,计算lookBackward数组时从前往后遍历,计算lookForward数组时从后向前遍历,这样刚刚分析的逻辑才成立。最后记得算上当前楼,输出+1。代码如下: import java.util.Scanner;
import java.util.*;
public class Main {
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
int n = sc.nextInt();
int[] nums = new int[n];
for (int i = 0; i < n; i++) {
nums[i] = sc.nextInt();
}
int[] lookBackward = new int[n];
int[] lookForward = new int[n];
int[] results = new int[n];
Deque<Integer> stack = new ArrayDeque<>();
stack.push(nums[0]);
for(int i = 1; i < n; i++){
lookBackward[i] = stack.size();
if(!stack.isEmpty() && nums[i] >= stack.peek()){
stack.pop();
}
stack.push(nums[i]);
}
stack.clear();
stack.push(nums[n-1]);
for(int i = n-2; i >= 0; i--){
lookForward[i] = stack.size();
if(!stack.isEmpty() && nums[i] >= stack.peek()){
stack.pop();
}
stack.push(nums[i]);
}
for(int i=0; i < n; i++){
results[i] = lookBackward[i] + lookForward[i] + 1;
System.out.print(results[i] + " ");
}
}
}
查看原帖
点赞 3
相关推荐
牛客热帖
正在热议
# 25届秋招总结 #
338745次浏览 3225人参与
# 我的实习求职记录 #
6076595次浏览 83588人参与
# 百度开奖 #
190708次浏览 1215人参与
# 地方国企笔面经互助 #
4756次浏览 12人参与
# 运营商笔面经互助 #
91794次浏览 1328人参与
# 选完offer后,你后悔学本专业吗 #
22316次浏览 159人参与
# 北方华创开奖 #
38614次浏览 401人参与
# 职场吐槽大会 #
89641次浏览 736人参与
# 如果有时光机,你最想去到哪个年纪? #
23040次浏览 455人参与
# 如何一边实习一边秋招 #
998335次浏览 12679人参与
# 国企还是互联网,你怎么选? #
89607次浏览 697人参与
# 腾讯求职进展汇总 #
197671次浏览 1650人参与
# 银行笔面经互助 #
84125次浏览 887人参与
# 第一份工作应该选择高薪还是大平台 #
88632次浏览 589人参与
# bilibili求职进展汇总 #
33628次浏览 359人参与
# 风评不好的公司,你会去吗? #
20469次浏览 94人参与
# 许愿池 #
215175次浏览 2535人参与
# 上班苦还是上学苦呢? #
77009次浏览 713人参与
# 正在实习的你,几点下班 #
53729次浏览 397人参与
# 国央企薪资爆料 #
12827次浏览 94人参与
# 海康威视求职进展汇总 #
401429次浏览 3413人参与
# 学历or实习经历,哪个更重要 #
54504次浏览 427人参与