关注
第三题我完全参考了檐之同学的思路,可以把算法复杂度从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
相关推荐
点赞 评论 收藏
分享
牛客热帖
更多
正在热议
更多
# 今年春招是金一银二嘛? #
27475次浏览 253人参与
# 机械制造2024笔面经 #
1515031次浏览 12994人参与
# 没关系,至少我的__很曼妙 #
11684次浏览 183人参与
# 软开人,秋招你打算投哪些公司呢 #
176367次浏览 1314人参与
# 牛客吐槽大会 #
10165次浏览 187人参与
# 帆软软件工作体验 #
10225次浏览 46人参与
# AI求职实录 #
16776次浏览 391人参与
# 快手年终开大包 #
3859次浏览 51人参与
# 抛开难度不谈,你最想去哪家公司? #
15127次浏览 217人参与
# 赚钱的意义在这一刻具象化 #
11340次浏览 211人参与
# 为什么有人零实习也能进大厂? #
14155次浏览 246人参与
# 你的第一家实习公司是什么档次? #
12644次浏览 136人参与
# 考研人,我有话说 #
163975次浏览 1243人参与
# 总结:哪家公司面试体验感最好 #
79645次浏览 445人参与
# 1月小结:你过的开心吗? #
4964次浏览 85人参与
# Prompt分享 #
17638次浏览 409人参与
# AI时代的工作 VS 传统时代的工作,有哪些不同? #
16140次浏览 370人参与
# 当你问AI“你会取代我的工作吗”,它说_? #
8790次浏览 232人参与
# 实习生活中那些难忘的瞬间 #
293289次浏览 3222人参与
# 实习最想跑路的瞬间 #
113106次浏览 694人参与