关注
第三题我完全参考了檐之同学的思路,可以把算法复杂度从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
相关推荐
点赞 评论 收藏
分享
点赞 评论 收藏
分享
点赞 评论 收藏
分享
牛客热帖
更多
正在热议
更多
# 春招开局,你有保底offer吗? #
4210次浏览 42人参与
# 如果不上班,你会去做什么 #
32674次浏览 474人参与
# 面试___岗的必刷题单 #
1161次浏览 22人参与
# 应届生被毁约被毁意向了怎么办 #
58766次浏览 293人参与
# 哪些公司开暑期实习了? #
2256次浏览 23人参与
# 硬件开发岗知多少 #
23835次浏览 137人参与
# 如果上班像打游戏,你最想解锁什么技能 #
26635次浏览 94人参与
# 你今年的保底offer是哪家 #
170647次浏览 708人参与
# 实习生至暗时刻 #
1192次浏览 28人参与
# 三月的小目标 #
1579次浏览 42人参与
# 找AI工作应该卷什么? #
786次浏览 19人参与
# 实习生的生存小技巧 #
1177次浏览 34人参与
# 小厂一定不能去吗? #
4971次浏览 76人参与
# 你经历过哪些AI幻觉? #
828次浏览 21人参与
# AI面试问题分享 #
1963次浏览 52人参与
# 你面试被问到过哪些不会的问题? #
113433次浏览 1904人参与
# 应届生,你找到工作了吗 #
118052次浏览 719人参与
# 职场新人体验 #
171901次浏览 1180人参与
# 26届的你们有几段实习? #
167328次浏览 1081人参与
# 牛友的志愿填报指南 #
54736次浏览 394人参与
查看11道真题和解析