①题目:看高楼题目:看高楼
②分析:
==人是在楼底,楼前。可向前看楼,也可以向后看楼
==至少能看到自己面前的这座楼
==看到的楼本质上,高度是严格递增的,所以可以借助于单调栈(单调递减栈)
③代码:Java语言描述
public int[] findBuilding (int[] heights) {
// write code here
Stack<Integer> stack1 = new Stack<>();
int n = heights.length;
int[] res = new int[n];
Arrays.fill(res,1); //最起码能看到自己所在的这栋楼
for(int i=0;i<n-1;i++){ //首先向左边看
//只要当前楼大于等于前面遍历过的楼,就把前面的矮楼丢掉,因为我站在该楼右边是看不到的
while(!stack1.isEmpty() && heights[i]>=stack1.peek()){
stack1.pop();
}
stack1.push(heights[i]);
//这里i+1才是核心,因为我已经通过while循环把比当前楼矮的都去掉了,所以栈里剩下的都比当前楼高
//也就是说当我站在该楼的右边一栋楼,栈里的楼我都能看到
res[i+1]+=stack1.size();
}
Stack<Integer> stack2 = new Stack<>();
for(int i=n-1;i>0;i--){ //然后向右边看
while(!stack2.isEmpty() && heights[i]>=stack2.peek()){
stack2.pop();
}
stack2.push(heights[i]);
res[i-1]+=stack2.size(); //同理
}
return res;
}
④思考和扩展:
== 【扩展】用PHP,JS,Go和C++语言实现
==【自我】为什么自己的数学解题能力强,但是编程算法偏弱,两者有哪些差异?
答:数学问题,一般是常量的输入条件,且数量级大小确定且很小,比如 数学版本的看高楼,就是 几个高楼的具体高度。
编程问题,也是 变量输入,一共多少楼知道,但是是可变的变量,为n座楼,每个楼的高度是已知的,但不确定。
数学问题解决的是一个问题。
编程问题解决的是一类类似问题。解法可反复利用,对大数据量的输入都管用,电脑替代人脑,只是需要编写相关的正确代码而已。
⑤其他
==【方法论】:
理解透彻题目
用笔画出来情景和单个具体的情况。
想想暴力破解,是怎么做的。
然后,优化其中的重复和效率低的地方,优化成好的算法(多借助于数据结构 栈,链表,队列等)
网友评论