首先是 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題目
想法:
從左從右慢慢地檢查到中間,檢查左牆跟右牆誰比較矮,矮的被捨棄往中間尋找(因為,就算高的牆再高,能容納的水量都會變少)
以下寫了兩個寫法,一個是基本寫法,一個是稍微進行優化的寫法
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
以上為今天了練習,謝謝大家的觀看