美文网首页
“雾失楼台,月迷津渡”之看高楼算法题 2022.02.09 周三

“雾失楼台,月迷津渡”之看高楼算法题 2022.02.09 周三

作者: 算法成瘾者 | 来源:发表于2022-02-09 09:10 被阅读0次
①题目:看高楼
题目:看高楼
②分析:

==人是在楼底,楼前。可向前看楼,也可以向后看楼

==至少能看到自己面前的这座楼

==看到的楼本质上,高度是严格递增的,所以可以借助于单调栈(单调递减栈)

③代码: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座楼,每个楼的高度是已知的,但不确定。

数学问题解决的是一个问题。

编程问题解决的是一类类似问题。解法可反复利用,对大数据量的输入都管用,电脑替代人脑,只是需要编写相关的正确代码而已。

⑤其他

==【方法论】:

  理解透彻题目

    用笔画出来情景和单个具体的情况。

    想想暴力破解,是怎么做的。

    然后,优化其中的重复和效率低的地方,优化成好的算法(多借助于数据结构 栈,链表,队列等)

相关文章

网友评论

      本文标题:“雾失楼台,月迷津渡”之看高楼算法题 2022.02.09 周三

      本文链接:https://www.haomeiwen.com/subject/fzqwkrtx.html