hot100练习-13
class Solution:def maxArea(self, height: List[int]) -> int:n = len(height)l, r = 0, n - 1ans = 0while l < r:if height[l] < height[r]:ans = max(ans, height[l] * (r-l))l += 1else:ans = max(ans, height[r] * (r-l))r -= 1return ans
双指针,如果左边的小于右边的,高定义为左边的,然后左边的+=1,反之同理。
class Solution:def threeSum(self, nums: List[int]) -> List[List[int]]:nums.sort()ans = []for i in range(len(nums) - 2):if nums[i] > 0: breakif i > 0 and nums[i] == nums[i-1]: continuel, r = i + 1, len(nums) - 1while l < r:s = nums[i] + nums[l] + nums[r]if s < 0:l += 1while l < r and nums[l] == nums[l-1]: l += 1elif s > 0:r -= 1while l < r and nums[r] == nums[r+1]: r -= 1else:ans.append([nums[i], nums[l], nums[r]])l += 1r -= 1while l < r and nums[l] == nums[l-1]: l += 1while l < r and nums[r] == nums[r+1]: r -= 1return ans
指针,排序之后好移动指针,固定第一个数,后面看总数大还是小,去移动指针
class Solution:def letterCombinations(self, digits: str) -> List[str]:phone = ['abc', 'def', 'ghi', 'jkl', 'mno', 'pqrs', 'tuv', 'wxyz']queue = ['']for digit in digits:for _ in range(len(queue)):# 弹出第一个元素tmp = queue.pop(0)for letter in phone[ord(digit) - 50]:queue.append(tmp + letter)return queue
用队列将要匹配的放队列里面,依次出去匹配再回来
ord('2')
返回 50
# Definition for singly-linked list.
# class ListNode:
# def __init__(self, val=0, next=None):
# self.val = val
# self.next = next
class Solution:def removeNthFromEnd(self, head: Optional[ListNode], n: int) -> Optional[ListNode]:left = right = dummy = ListNode(next=head)for _ in range(n):right = right.nextwhile right.next:left = left.nextright = right.nextleft.next = left.next.nextreturn dummy.next
因为有可能删除的head,所以设置一个哨兵节点,先让right走n步,然后一起走,最后left进行连接即可。
class Solution:def isValid(self, s: str) -> bool:dic = {'(':')', '{':'}', '[':']', '?':'?'}st = ['?']for c in s:if c in dic:st.append(c)elif dic[st.pop()] != c:return Falsereturn len(st) == 1