关注
第三题我完全参考了檐之同学的思路,可以把算法复杂度从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值得去吗? #
12130次浏览 139人参与
# 你觉得实习能学到东西吗 #
153066次浏览 1480人参与
# 联宝杯大学生创新大赛,你的技术值得产业级答案 #
45688次浏览 509人参与
# 如果春招能重来,我会___ #
13762次浏览 164人参与
# 想做Agent可以做哪些岗位? #
11868次浏览 387人参与
# 你会因为行情,降低找工作标准吗? #
23193次浏览 225人参与
# 搜狐工作体验 #
6763次浏览 54人参与
# 面试官拷打AI项目都会问什么? #
10378次浏览 365人参与
# 反问环节如何提问 #
141295次浏览 2739人参与
# 哔哩哔哩笔试 #
42224次浏览 166人参与
# 你觉得最好用的AI编程工具是_ #
4188次浏览 80人参与
# 非技术岗简历怎么写 #
338481次浏览 3301人参与
# 你实习是赚钱了还是亏钱了? #
126497次浏览 711人参与
# 入职第一天,你准备什么时候下班 #
122853次浏览 525人参与
# 机械人选offer,最看重什么? #
180621次浏览 872人参与
# 国央企薪资爆料 #
156885次浏览 604人参与
# 你想留在一线还是回老家? #
81140次浏览 620人参与
# 大厂还是考编 #
134199次浏览 1395人参与
# 除了线上,还能去哪些地方投简历 #
7807次浏览 87人参与
# 实习想申请秋招offer,能不能argue薪资 #
262436次浏览 1382人参与
# 你和你的mentor相处模式是__ #
14647次浏览 126人参与
查看1道真题和解析