iT邦幫忙

第 12 屆 iThome 鐵人賽

DAY 13
0
Software Development

刷刷題 or Alan Becker's game 製作 is a question 系列 第 13

(Medium) 11. Container With Most Water

  • 分享至 

  • xImage
  •  

描述:
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 and n is at least 2.


相當有趣的一題

題意: 好幾根柱子 高高低低,選兩柱 中間裝水,問最大水量。

思路: 任選兩柱 以較矮柱為高,因此得

min(height[left],height[right])

那寬度呢?
不要忘記 我們要求的是 最大面積,所以越寬越好(也就是說兩柱離越遠越好),
但是呢 面積為 長x寬 而 長以矮的為主,所以阿 感覺是每一種組合都得試試~~

起初 是以 double for 來組,再取最大 ... 但是會超時 QQ

所以看了 GeeksforGeeks - Container with Most WaterAlgorithm
遵循 Wait a day : 談談 寫程式技巧 寫了個 草稿大致怎麽做
https://ithelp.ithome.com.tw/upload/images/20200927/20111516DE2hyff8Xd.png
再想了一下,覺得那個 左右 移動很有道理 > 就是要找 較高的柱

左柱(左指針) 初始為 最左邊的那根
右柱(右指針) 初始為 最右邊的那根

如果 左柱 低於 右柱

左指針右移 找較高的柱

如果 右柱 低於 左柱

右指針左移 找較高的柱

過程中 紀錄目前面積最大的(在考慮兩柱取矮柱的條件下)
如果大於目前最大則更新,最後(左指針<右指針都跑完的情況)面積為所求。

正解

class Solution:
    def maxArea(self, height: List[int]) -> int:
        '''
        ans = 0 
        
        left = 0 
        right = (len(height)-1)
        
        for i in range(len(height)):
            for j in range(i+1,len(height)):
                #print(j)
                v = min(height[i],height[j])
                area = v*(j-i)
                if area > ans:
                    ans = area
                    v1 = i
                    v2 = j 
                     
        #print(ans)
        
        #print("v1"+str(v1))
        #print("v2"+str(v2))
        return ans
        '''
        last = len(height)-1
        first = 0
        ans = 0 
        while first < last:
            cur = min(height[first],height[last])*(last-first)
            print("cur:"+str(cur))
            if cur > ans:
                ans = cur
            if height[first] > height[last]:
                last -=1
            else:
                first += 1
        print(ans)
        return ans
            
        
        

PS: 註解為 TTL 時的 Code
Note: print 盡量拿掉 因為太多print 可能造成 Runtime Error

Result
https://ithelp.ithome.com.tw/upload/images/20200927/20111516PwrAJuOwk1.png


上一篇
(Easy) 242. Valid Anagram
下一篇
(Medium) 12. Integer to Roman
系列文
刷刷題 or Alan Becker's game 製作 is a question 30
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言