首先是 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
以上為今天了練習,謝謝大家的觀看