classSolution: defexist(self, board: List[List[str]], word: str) -> bool: n = len(word) r,c = len(board),len(board[0]) visited = [[False]*c for _ inrange(r)] defbackdraw(i,j,position): if position == n:returnTrue for temp_i,temp_j in [[i-1,j],[i+1,j],[i,j-1],[i,j+1]]: if0<=temp_i<r and0<=temp_j<c and visited[temp_i][temp_j]==False: if board[temp_i][temp_j]==word[position]: visited[temp_i][temp_j]=True if backdraw(temp_i,temp_j,position+1): returnTrue visited[temp_i][temp_j]=False returnFalse res = False for i inrange(r): for j inrange(c): if board[i][j]==word[0]: visited[i][j]=True res = backdraw(i,j,1) if res:return res visited[i][j]=False return res
classSolution: defsearchInsert(self, nums: List[int], target: int) -> int: left = 0 right = len(nums)-1 ans = len(nums) while left<=right: mid = (left+right)//2 if target<=nums[mid]: ans = mid right = mid-1 else: left = mid+1 return ans
classSolution: defsearchRange(self, nums: List[int], target: int) -> List[int]: left,right,mid = 0,len(nums)-1,len(nums) res = -1 while left<=right: mid = (left+right)//2 if target==nums[mid]: res = mid break if target<nums[mid]: right = mid-1 else: left = mid+1 if res!=-1: left = mid while left>0and nums[left-1]==target: left-=1 right = mid while right<len(nums)-1and nums[right+1]==target: right+=1 else: left = right = res return [left,right]
classSolution: deffindMin(self, nums: List[int]) -> int: left,right,ans = 0,len(nums)-1,len(nums)-1 end = nums[right] if nums[left]<=nums[right]:return nums[left] while left<=right: mid = (left+right)//2 if end>=nums[mid]: ans = mid right = mid-1 else: left = mid+1 return nums[ans]
# Your MinStack object will be instantiated and called as such: # obj = MinStack() # obj.push(val) # obj.pop() # param_3 = obj.top() # param_4 = obj.getMin()
classSolution: defdailyTemperatures(self, temperatures: List[int]) -> List[int]: n = len(temperatures) res = [0]*n temp = [] temp.append(0) for i inrange(1,n): whilelen(temp)!=0and temperatures[i]>temperatures[temp[-1]]: if temperatures[i]>temperatures[temp[-1]]: res[temp[-1]]=i - temp[-1] temp.pop() temp.append(i) return res
classSolution: deflargestRectangleArea(self, heights: List[int]) -> int: n = len(heights) left,right = [0]*n,[0]*n left_stack = [] for i inrange(n): while left_stack and heights[i]<=heights[left_stack[-1]]: left_stack.pop() if left_stack: left[i] = left_stack[-1] else: left[i] = -1 left_stack.append(i) right_stack = [] for i inrange(n-1,-1,-1): while right_stack and heights[i]<=heights[right_stack[-1]]: right_stack.pop() if right_stack: right[i] = right_stack[-1] else: right[i] = n right_stack.append(i) max_num = max((right[i]-left[i]-1)*heights[i] for i inrange(n)) if n>0else0 return max_num
classSolution: deffindKthLargest(self, nums: List[int], k: int) -> int: vsited = [] for num in nums: heapq.heappush(vsited,-num) while k!=0: res = -heapq.heappop(vsited) k-=1 return res
class Solution: def topKFrequent(self, nums: List[int], k: int) -> List[int]: dicttemp = {} for num in nums: if num in dicttemp: dicttemp[num]+=1 else: dicttemp[num]=1 temp = [] for key in dicttemp: # print(temp) value = dicttemp[key] if len(temp)<k: heapq.heappush(temp,(value,key)) else: if value>temp[0][0]: heapq.heappop(temp) heapq.heappush(temp,(value,key)) res = [val for key,val in temp] return res
n = len(nums) if n ==1: return nums[0] dp = [0]*n dp[0] = nums[0] dp[1] = max(nums[0],nums[1]) for i inrange(2,n): dp[i] = max(dp[i-2]+nums[i],dp[i-1]) return dp[n-1]
classSolution: defnumSquares(self, n: int) -> int: dq = [0]*(n+1) for i inrange(1,n+1): minn = n for j inrange(1,int(i**0.5)+1): minn = min(minn,dq[i-j*j]) dq[i] = minn+1 return dq[n]
classSolution: defcoinChange(self, coins: List[int], amount: int) -> int: dq = [-1]*(amount+1) dq[0]=0 for i inrange(1,amount+1): if i in coins: dq[i]=1 else: flag = 0 minn = float(inf) for coin in coins: if coin<i and dq[i-coin]>-1: flag = 1 minn = min(minn,dq[i-coin]) if flag == 1: dq[i] = minn+1 return dq[amount]
classSolution: defwordBreak(self, s: str, wordDict: List[str]) -> bool: n = len(s) last_set = [0] for i inrange(0,n): for last in last_set: # print(s[last:i+1]) if s[last:i+1] in wordDict: last_set.append(i+1) break # print(last_set) if n in last_set:returnTrue else:returnFalse
classSolution: defcanPartition(self, nums: List[int]) -> bool: n = len(nums)
if n<2:returnFalse
total = sum(nums)
if total%2 ==1: returnFalse
target = total//2 maxnum = max(nums)
if maxnum>target:returnFalse
dp = [[False] * (target+1) for _ inrange(n)] for i inrange(n): dp[i][0] = True
dp[i][nums[0]] = True for i inrange(1,n): num = nums[i] for j inrange(1,target+1): if j>=num: dp[i][j] = dp[i-1][j] | dp[i-1][j-num] else: dp[i][j] = dp[i-1][j] return dp[n-1][target]
classSolution: defuniquePaths(self, m: int, n: int) -> int: dp = [[0]*n for _ inrange(m)] for i inrange(m): dp[i][0] = 1 for i inrange(n): dp[0][i] = 1 for i inrange(1,m): for j inrange(1,n): dp[i][j] = dp[i-1][j]+dp[i][j-1] return (dp[m-1][n-1])
classSolution: deflongestPalindrome(self, s: str) -> str: n = len(s) if n==0:return"" dp = [[0]*n for _ inrange(n)] maxx = 0 max_ij = [0,0] for i inrange(n): dp[i][i] = 1 for i inrange(1,n): if s[i-1]==s[i]: dp[i-1][i]=1 maxx = 2 max_ij = [i-1,i] for i inrange(2,n): for j inrange(n): if j+i<n and s[j]==s[j+i] and dp[j+1][j+i-1]==1: dp[j][j+i] = 1 maxx = i+1 max_ij = [j,j+i] return s[max_ij[0]:max_ij[1]+1]
classSolution: defminDistance(self, word1: str, word2: str) -> int: m,n = len(word1), len(word2) if m==0:return n if n==0:return m dp = [[0]*(n+1) for _ inrange(m+1)] for i inrange(m+1): dp[i][0] = i for j inrange(n+1): dp[0][j] = j for i inrange(1,m+1): for j inrange(1,n+1): left = dp[i-1][j]+1 right = dp[i][j-1]+1 left_right = dp[i-1][j-1] if word1[i-1]!=word2[j-1]: left_right+=1 dp[i][j] = min(left,right,left_right) return dp[m][n]
classSolution: defsingleNumber(self, nums: List[int]) -> int: hashtable = [] for num in nums: if num notin hashtable: hashtable.append(num) else: hashtable.remove(num) return hashtable[0]
classSolution: deffindDuplicate(self, nums: List[int]) -> int: n = len(nums) i = 0 whileTrue: temp = nums[i] if temp == i+1: i +=1 else: if nums[temp-1]==temp: return temp else: nums[temp-1],nums[i] = nums[i],nums[temp-1]
题解-二分查找,二分查找的是1到n的这个数组而不是原本的数组。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15
classSolution: deffindDuplicate(self, nums: List[int]) -> int: n = len(nums) left,right = 1,n-1 while left<right: mid = (left+right)//2 count = 0 for num in nums: if num<=mid: count+=1 if count>mid: right = mid else: left = mid+1 return left