iT邦幫忙

2022 iThome 鐵人賽

DAY 28
0
自我挑戰組

leetcode 30天 不中斷解題挑戰系列 第 28

Day28 leetcode 隨機挑題 (Math、Two Pointer、Array)

  • 分享至 

  • xImage
  •  

首先是 976. Largest Perimeter Triangle (easy)
https://leetcode.com/problems/largest-perimeter-triangle/

給很多個邊長,從中找出可以組成三角形又是最長周長的解答。

想法:
排序,從最長的三邊開始往下進行檢查。
別忘記 c < a+b 三角形基本定義

class Solution:
    #給很多個邊,檢查是否可以成為三角形
    #可以的話回傳最大周長
    def largestPerimeter(self, nums: List[int]) -> int:
        nums.sort(reverse = True)
        for i in range(2,len(nums)):
            if nums[i-2] < nums[i-1]+nums[i]:
                return sum(nums[i-2:i+1])
        return 0

接下來是 11. Container With Most Water (medium)
https://leetcode.com/problems/container-with-most-water/

給一數字串列,代表牆壁高度,求最大可以容納的水的容積,算是基本的Two Pointer題目
https://ithelp.ithome.com.tw/upload/images/20221013/20108649gvABxpCO2e.jpg

想法:
從左從右慢慢地檢查到中間,檢查左牆跟右牆誰比較矮,矮的被捨棄往中間尋找(因為,就算高的牆再高,能容納的水量都會變少)

以下寫了兩個寫法,一個是基本寫法,一個是稍微進行優化的寫法

class Solution:
    def maxArea(self, height: List[int]) -> int:
        L,R = 0,len(height)-1
        ans = 0
        while L<R:
            if height[L]<height[R]:
                ans = max(ans,height[L]*(R-L))
                L+=1
            else:
                ans = max(ans,height[R]*(R-L))
                R-=1
        return ans
    
    #略為優化版本
    def maxArea(self, height: List[int]) -> int:
        L,R = 0,len(height)-1
        ans = 0
        while L<R:
            if height[L]<height[R]:
                ans = max(ans,height[L]*(R-L))
                temp = L+1
                while height[temp]<height[L] and temp<R:#如果下一道牆沒有比較高就沒有留下來的必要了
                    temp+=1
                L = temp
            else:
                ans = max(ans,height[R]*(R-L))
                temp = R-1
                while height[R]>=height[temp] and L<temp:
                    temp-=1
                R = temp
        return ans

接下來是 977. Squares of a Sorted Array (easy)

給一個數列(含正負整數),平方後由小到大排序。
題目下面有提到,是否可以不使用平方後sort的辦法。
叛逆的我,當然兩個方法都寫了,第二個的寫法就跟正常的Two Pointer寫法一樣,但沒比較快....

class Solution:
    #升序數列
    def sortedSquares(self, nums: List[int]) -> List[int]:
        tempL = [i**2 for i in nums]
        tempL.sort()
        return tempL
    
    #如果跟題目要求的一樣
    #不用先平方+排序的方法
    #但沒比較快
    def sortedSquares(self, nums: List[int]) -> List[int]:
        L,R = 0,len(nums)-1
        ans = []
        while L<=R:
            if abs(nums[L])>nums[R]:
                ans.insert(0,nums[L]**2)
                L+=1
            else:
                ans.insert(0,nums[R]**2)
                R-=1
        return ans

以上為今天了練習,謝謝大家的觀看


上一篇
Day27 leetcode 隨機選題 (Array、Two Pointer、String)
下一篇
Day29 leetcode隨機選題 (Math、Sorting、Array)
系列文
leetcode 30天 不中斷解題挑戰30
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言