山东大学吧 关注:442,062贴子:10,746,382

〔算法讨论贴〕欢迎高智商苗苗前来讨论

只看楼主收藏回复

RT, 楼主在刷leetcode, 准备IT公司的面试,但是楼主不喜欢看答案,所以遇到的没什么思路的题就po在这个帖子里跟大家互相交流想法,共同进步~
算法我的理解是想出一个解决问题的方法,并尽量高效地解决问题,所以我觉得算法门槛很低。只要你聪明一些,思维发散一些,就算没学过算法,都希望你能关注这个帖子,常来讨论,人多了总能想到解决问题的方法。
本帖半年之内长期有效, 所以请尽量在楼中楼进行讨论,如果觉得不方便的苗苗直接点只看楼主,在每道算法题下的楼中楼讨论。
Apple Inc. 镇楼


1楼2015-09-01 08:50回复
    1. 给出一个数组,数组中都为非负整数,数组中的每个数字代表了厚度为0的墙的高度。问题:从数组中找出两堵墙, 和x轴一起形成一个容器,使其可以有最大的容量,返回那个容量。
    首先要避免穷举法,就是把所有的两堵墙组合都找出来,一个一个算面积,然后返回最大值,那就是Cn2(n个数中任意找出两个不同的数),n*(n-1)/2步, 虽然可以,但是不符合程序时间的要求。
    其次。。我也没有什么好的思路,因为数组必须固定不变的分析,数组记录了整个地形,不可以随意更改。。无论从首尾开始找还是从最高的点开始找感觉都怪怪的,因为毕竟还有一个变量是宽度,不完全是高度说了算。


    2楼2015-09-01 08:58
    收起回复
      我叉,看不懂。


      IP属地:山东来自iPhone客户端3楼2015-09-01 09:05
      收起回复
        没有提到宽度啊,是数组下标对应宽度吗?


        来自Android客户端4楼2015-09-01 09:23
        收起回复
          Given n non-negative integers a1, a2, ..., an, where each represents a point at coordinate (i, ai). n vertical lines are drawn such that the two endpoints of line i is at (i, ai) and (i, 0). Find two lines, which together with x-axis forms a container, such that the container contains the most water.
          Note: You may not slant the container.


          6楼2015-09-01 10:01
          收起回复
            这种问题要想log(n)一般就两种思路,要么从头开始每个index求一个key,要么从两头往中间靠。我看这道题应该是第二种思路


            来自Android客户端7楼2015-09-01 10:03
            收起回复
              我也高智商 但是我拒绝讨论这个问题


              来自iPhone客户端9楼2015-09-01 10:20
              收起回复


                IP属地:山东来自Android客户端10楼2015-09-01 10:24
                回复
                  帖子不错,先留名


                  IP属地:山东来自iPhone客户端11楼2015-09-01 10:29
                  回复
                    美帝猫又来虐智商了


                    来自iPhone客户端12楼2015-09-01 10:30
                    回复
                      都到后排了


                      来自Android客户端13楼2015-09-01 10:47
                      回复
                        英文说的是线,怎么上面又说是墙了呢? 空间中的平面构成一个容器最少需要四个面


                        IP属地:北京来自Android客户端14楼2015-09-01 10:52
                        回复
                          拆墙需要挖掘机,那么问题来了


                          IP属地:山东来自Android客户端15楼2015-09-01 10:59
                          回复
                            挖掘机也可以炒菜,所以问题又来了


                            IP属地:广东来自Android客户端16楼2015-09-01 11:02
                            回复
                              考虑所求最大值(j-i)*min(h[i],h[j]),可知左右挡板短板为瓶颈,因此每次更新短的一边即可。
                              while(i<j)
                              {
                              ans=max(ans,(j-i)*min(h[i],h[j]));
                              (h[i]<h[j])?i++:j--;
                              }
                              复杂度O(n)


                              IP属地:美国18楼2015-09-01 14:01
                              回复