215. 数组中的第K个最大元素
方法一:堆
import heapq
class Solution(object):
def findKthLargest(self, nums, k):
res=[]
for num in nums:
heapq.heappush(res,num)
if len(res)>k:
heapq.heappop(res)
return res[0]
方法二:快排
class Solution(object):
def quicksort(self,nums,left,right):
i=random.randint(left,right)
pivot=nums[i]
nums[left],nums[i]=nums[i],nums[left]
i,j=left+1,right
while True:
while i<=j and nums[i]<pivot:
i+=1
while i<=j and nums[j]>pivot:
j-=1
if i>=j:
break
nums[i],nums[j]=nums[j],nums[i]
i+=1
j-=1
nums[left],nums[j]=nums[j],nums[left]
return j
def findKthLargest(self, nums, k):
target_index=len(nums)-k
left,right=0,len(nums)-1
while True:
idx=self.quicksort(nums,left,right)
if idx==target_index:
return nums[idx]
elif idx<target_index:
left=idx+1
else:
right=idx-1
56. 合并区间
class Solution(object):
def merge(self, intervals):
intervals=sorted(intervals,key=lambda x:x[0])
left,right=intervals[0][0],intervals[0][1]
res=[]
for i,j in intervals:
if right<i:
res.append([left,right])
left,right=i,j
else:
right=max(right,j)
res.append([left,right])
return res
33. 搜索旋转排序数组
class Solution(object):
def search(self, nums, target):
left,right=0,len(nums)-1
while left<=right:
mid=left+(right-left)//2
if nums[mid]==target:
return mid
if nums[left]<=nums[mid]:
if nums[left]<=target<nums[mid]:
right=mid-1
else:
left=mid+1
else:
if nums[mid]<target<=nums[right]:
left=mid+1
else:
right=mid-1
return -1
43. 字符串相乘
class Solution(object):
def multiply(self, num1, num2):
if num1=="0" or num2=="0":
return "0"
m,n=len(num1),len(num2)
res=[0]*(m+n)
for i in range(m-1,-1,-1):
for j in range(n-1,-1,-1):
mul=(ord(num1[i])-48)*(ord(num2[j])-48)
p1,p2=i+j,i+j+1
total=mul+res[p2]
res[p1]+=total//10
res[p2]=total%10
for i in range(m+n):
if res[i]!=0:
return "".join([str(x) for x in res[i:]])
55. 跳跃游戏
class Solution(object):
def canJump(self, nums):
end=0
for i,num in enumerate(nums):
if end<i:
return False
end=max(end,num+i)
if end>=len(nums)-1:
return True
53. 最大子数组和
class Solution(object):
def maxSubArray(self, nums):
res=nums[0]
cur_sum=nums[0]
for i in range(1,len(nums)):
if cur_sum+nums[i]<nums[i]:
cur_sum=nums[i]
else:
cur_sum=cur_sum+nums[i]
if cur_sum>res:
res=cur_sum
return res
695. 岛屿的最大面积
class Solution(object):
def DFS(self,x,y,m,n,grid):
if x>=0 and x<m and y<n and y>=0 and grid[x][y]==1:
grid[x][y]=0
self.cur_area+=1
for i,j in self.dir:
cur_x,cur_y=x+i,y+j
self.DFS(cur_x,cur_y,m,n,grid)
def maxAreaOfIsland(self, grid):
self.dir=[[1,0],[-1,0],[0,1],[0,-1]]
m,n=len(grid),len(grid[0])
self.max_area=0
self.cur_area=0
for i in range(m):
for j in range(n):
if grid[i][j]==1:
self.DFS(i,j,m,n,grid)
self.max_area=max(self.max_area,self.cur_area)
self.cur_area=0
return self.max_area
54. 螺旋矩阵
class Solution(object):
def fun(self,x,y,m,n,matrix):
for j in range(n-1):
self.res.append(matrix[x][y+j])
for i in range(m-1):
self.res.append(matrix[x+i][y+n-1])
for j in range(n-1):
self.res.append(matrix[x+m-1][y+n-1-j])
for i in range(m-1):
self.res.append(matrix[x+m-1-i][y])
def spiralOrder(self, matrix):
m,n=len(matrix),len(matrix[0])
x,y=0,0
self.res=[]
while m>1 and n>1:
self.fun(x,y,m,n,matrix)
x+=1
y+=1
m-=2
n-=2
while m==1:
for j in range(n):
self.res.append(matrix[x][y+j])
return self.res
while n==1:
for i in range(m):
self.res.append(matrix[x+i][y])
return self.res
return self.res
3. 无重复字符的最长子串
class Solution(object):
def lengthOfLongestSubstring(self, s):
mp=[0]*128
max_length=0
left=0
cur_length=0
for right,c in enumerate(s):
t=ord(c)
mp[t]+=1
if mp[t]==1:
cur_length+=1
max_length=max(cur_length,max_length)
else:
while mp[t]>1:
mp[ord(s[left])]-=1
left+=1
cur_length=right-left+1
return max_length
69. x 的平方根
二分查找:若未查找到,right指向的是小于target的最大数字,left指向的是大于target的最小数字
right:x的平方根
left:插入位置
class Solution(object):
def mySqrt(self, x):
left,right=0,x
while (left<=right):
mid=left+(right-left)//2
if mid<x//mid:
left=mid+1
elif mid>x//mid:
right=mid-1
else:
return mid
return right
206. 反转链表
class Solution(object):
def reverseList(self, head):
dummy=ListNode()
while head:
cur=head.next
head.next=dummy.next
dummy.next=head
head=cur
return dummy.next
48. 旋转图像
class Solution(object):
def rotate(self, matrix):
n=len(matrix)
for i in range(n):
for j in range(i,n):
matrix[i][j],matrix[j][i]=matrix[j][i],matrix[i][j]
for i in range(n):
for j in range(n//2):
matrix[i][j],matrix[i][n-1-j]=matrix[i][n-1-j],matrix[i][j]
264. 丑数 II
class Solution(object):
def nthUglyNumber(self, n):
res=[1]*n
p2,p3,p5=0,0,0
for i in range(1,n):
next2=res[p2]*2
next3=res[p3]*3
next5=res[p5]*5
next_ugly=min(next2,next3,next5)
res[i]=next_ugly
if next_ugly==next2:
p2+=1
if next_ugly==next3:
p3+=1
if next_ugly==next5:
p5+=1
return res[n-1]
143. 重排链表
class Solution(object):
def reorderList(self, head):
if not head.next:
return head
dummy=ListNode(next=head)
slow,fast=dummy,head
while fast and fast.next:
fast=fast.next.next
slow=slow.next
fast=slow.next
slow.next=None
while fast:
cur=fast.next
fast.next=slow.next
slow.next=fast
fast=cur
A=head
B=slow.next
slow.next=None
tail=dummy
while A and B:
next_A,next_B=A.next,B.next
tail.next=A
A.next=B
tail=B
A,B=next_A,next_B
return dummy.next
39. 组合总和
class Solution(object):
def fun(self,candidates,target,ans,x):
if target==0:
self.res.append(ans[:])
return
for i in range(x,len(candidates)):
if target<candidates[i]:
return
ans.append(candidates[i])
self.fun(candidates,target-candidates[i],ans,i)
ans.pop()
def combinationSum(self, candidates, target):
candidates=sorted(candidates)
self.res=[]
self.fun(candidates,target,[],0)
return self.res
200. 岛屿数量
class Solution(object):
def fun(self,candidates,target,ans,x):
if target==0:
self.res.append(ans[:])
return
for i in range(x,len(candidates)):
if target<candidates[i]:
return
ans.append(candidates[i])
self.fun(candidates,target-candidates[i],ans,i)
ans.pop()
def combinationSum(self, candidates, target):
candidates=sorted(candidates)
self.res=[]
self.fun(candidates,target,[],0)
return self.res
15. 三数之和
class Solution(object):
def threeSum(self, nums):
nums=sorted(nums)
n=len(nums)
res=[]
for i in range(n-2):
if nums[i]>0:
break
if i>0 and nums[i-1]==nums[i]:
continue
x,y=i+1,n-1
target=0-nums[i]
while x<y:
a,b=nums[x],nums[y]
if a+b<target:
x+=1
elif a+b>target:
y-=1
else:
res.append([nums[i],a,b])
while x<y and nums[x]==a:
x+=1
while x<y and nums[y]==b:
y-=1
return res
46. 全排列
class Solution(object):
def fun(self,nums,ans):
if len(ans) == len(nums):
self.res.append(ans[:])
return
for i in range(len(nums)):
if self.flag[i]==0:
self.flag[i]=1
ans.append(nums[i])
self.fun(nums,ans)
self.flag[i]=0
ans.pop()
def permute(self, nums):
self.res=[]
n=len(nums)
self.flag=[0]*n
self.fun(nums,[])
return self.res
169. 多数元素
class Solution(object):
def majorityElement(self, nums):
candidate=None
count=0
for num in nums:
if count==0:
candidate=num
else:
count+=1 if candidate==num else -1
return candidate
107. 二叉树的层序遍历 II
from collections import deque
class Solution(object):
def levelOrderBottom(self, root):
if not root:
return []
dq=deque()
dq.append(root)
count=len(dq)
res=[]
ans=[]
while dq:
cur=dq.popleft()
ans.append(cur.val)
count-=1
if cur.left:
dq.append(cur.left)
if cur.right:
dq.append(cur.right)
if count==0:
res.append(ans)
ans=[]
count=len(dq)
for i in range(len(res)//2):
res[i],res[len(res)-1-i]= res[len(res)-1-i],res[i]
return res
470. 用 Rand7() 实现 Rand10()
class Solution(object):
def rand10(self):
while True:
a=rand7()
b=rand7()
num=(a-1)*7+b
if num>40:
continue
return (num-1)%10+1
5. 最长回文子串
class Solution(object):
def longestPalindrome(self, s):
n=len(s)
dp=[[False]*n for i in range(n)]
start=0
max_length=1
for i in range(n):
dp[i][i]=True
for length in range(2,n+1):
for i in range(n-length+1):
j=i+length-1
if s[i]==s[j] and (dp[i+1][j-1]==True or length==2):
dp[i][j]=True
if length>max_length:
max_length=length
start=i
return s[start:start+max_length]
1288. 删除被覆盖区间
class Solution(object):
def removeCoveredIntervals(self, intervals):
if len(intervals)==0 or len(intervals)==1:
return len(intervals)
intervals = sorted(intervals, key=lambda x: (x[0], -x[1]))
count=1
left,right=intervals[0][0],intervals[0][1]
for i in range(1,len(intervals)):
if left<=intervals[i][0] and right>=intervals[i][1]:
continue
else:
count+=1
left,right=intervals[i][0],intervals[i][1]
return count
4. 寻找两个正序数组的中位数
class Solution(object):
def findK(self,nums1,nums2,k):
if not nums1:
return nums2[k-1]
if not nums2:
return nums1[k-1]
if k==1:
return min(nums1[0],nums2[0])
x=len(nums1) if k//2>len(nums1) else k//2
y=len(nums2) if k-k//2>len(nums2) else k-k//2
if nums1[x-1]>nums2[y-1]:
return self.findK(nums1,nums2[y:],k-y)
else:
return self.findK(nums1[x:],nums2,k-x)
def findMedianSortedArrays(self, nums1, nums2):
m,n=len(nums1),len(nums2)
total=m+n
if total%2==0:
return (self.findK(nums1,nums2,total//2)+self.findK(nums1,nums2,total//2+1))/2.0
return self.findK(nums1,nums2,total//2+1)
113. 路径总和 II
class Solution(object):
def fun(self,node,targetSum,ans):
if targetSum==0 and not node.left and not node.right:
self.res.append(ans[:])
if node.left:
ans.append(node.left.val)
self.fun(node.left,targetSum-node.left.val,ans)
ans.pop()
if node.right:
ans.append(node.right.val)
self.fun(node.right,targetSum-node.right.val,ans)
ans.pop()
def pathSum(self, root, targetSum):
if not root:
return []
self.res=[]
self.fun(root,targetSum-root.val,[root.val])
return self.res
121. 买卖股票的最佳时机
class Solution(object):
def maxProfit(self, prices):
min_price=float("inf")
profit=0
for price in prices:
min_price=min(min_price,price)
profit=max(profit,price-min_price)
return profit
40. 组合总和 II
class Solution(object):
def fun(self,candidates,target,x,res):
if target==0:
self.res.append(res[:])
return
if x==len(candidates):
return
for i in range(x,len(candidates)):
if candidates[i]>target:
return
if i > x and candidates[i] == candidates[i-1]:
continue
res.append(candidates[i])
self.fun(candidates,target-candidates[i],i+1,res)
res.pop()
def combinationSum2(self, candidates, target):
candidates=sorted(candidates)
self.res=[]
self.fun(candidates,target,0,[])
return self.res
172. 阶乘后的零
class Solution(object):
def trailingZeroes(self, n):
ans=0
while n:
n//=5
ans+=n
return ans
912. 排序数组
class Solution(object):
def merge(self,nums1,nums2):
if not nums1:
return nums2
if not nums2:
return nums1
nums=[]
i,j=0,0
while i<len(nums1) and j<len(nums2):
if nums1[i]<nums2[j]:
nums.append(nums1[i])
i+=1
else:
nums.append(nums2[j])
j+=1
while i<len(nums1):
nums.append(nums1[i])
i+=1
while j<len(nums2):
nums.append(nums2[j])
j+=1
return nums
def sortArray(self, nums):
if len(nums) <= 1:
return nums
mid=len(nums)//2
nums1=self.sortArray(nums[:mid])
nums2=self.sortArray(nums[mid:])
return self.merge(nums1,nums2)
911 · 最大子数组之和为k
class Solution:
"""
@param nums: an array
@param k: a target value
@return: the maximum length of a subarray that sums to k
"""
def max_sub_array_len(self, nums, k):
mp={0:-1}
cur_sum=0
max_len=0
for i,num in enumerate(nums):
cur_sum+=num
if cur_sum not in mp:
mp[cur_sum]=i
if cur_sum-k in mp:
max_len=max(max_len,i-mp[cur_sum-k])
return max_len
845. 数组中的最长山脉
class Solution(object):
def longestMountain(self, arr):
max_len=0
for i in range(1,len(arr)-1):
if arr[i]>arr[i-1] and arr[i]>arr[i+1]:
cur_len=1
a,b=i,i
while a>0 and arr[a]>arr[a-1]:
cur_len+=1
a=a-1
while b<len(arr)-1 and arr[b]>arr[b+1]:
cur_len+=1
b=b+1
max_len=max(max_len,cur_len)
return max_len
10. 正则表达式匹配
class Solution(object):
def isMatch(self, s, p):
m,n=len(s),len(p)
dp=[[False]*(n+1) for _ in range(m+1)]
dp[0][0]=True
for i in range(2,n+1):
if p[i-1]=="*":
dp[0][i]=dp[0][i-2]
for i in range(1,m+1):
for j in range(1,n+1):
if p[j-1]!="*":
if p[j-1]=="." or p[j-1]==s[i-1]:
dp[i][j]=dp[i-1][j-1]
else:
dp[i][j]=dp[i][j-2]
if p[j-2]=="." or p[j-2]==s[i-1]:
dp[i][j]=dp[i][j] or dp[i-1][j]
return dp[m][n]
面试题 01.07. 旋转矩阵
class Solution(object):
def rotate(self, matrix):
n=len(matrix)
for i in range(n):
for j in range(i,n):
matrix[i][j],matrix[j][i]=matrix[j][i],matrix[i][j]
for i in range(n):
for j in range(n//2):
matrix[i][j],matrix[i][n-1-j]=matrix[i][n-1-j], matrix[i][j]
return matrix
334. 递增的三元子序列
class Solution(object):
def increasingTriplet(self, nums):
first,second=float("inf"),float("inf")
for num in nums:
if num<=first:
first=num
elif num<=second:
second=num
else:
return True
return False
146. LRU 缓存
class Node():
def __init__(self,key=0,value=0,per=None,next=None):
self.key=key
self.value=value
self.per=per
self.next=next
class LRUCache(object):
def __init__(self, capacity):
self.capacity=capacity
self.full=0
self.head=Node()
self.tail=Node()
self.head.next=self.tail
self.tail.per=self.head
self.mp={}
def add_node(self,node):
node.next=self.head.next
node.per=self.head
self.head.next.per=node
self.head.next=node
def remove_node(self,node):
node.per.next=node.next
node.next.per=node.per
def remove_tail_node(self):
node=self.tail.per
self.remove_node(node)
return node
def add_head_node(self,node):
self.remove_node(node)
self.add_node(node)
def get(self, key):
if key in self.mp:
node=self.mp[key]
self.add_head_node(node)
return self.mp[key].value
return -1
def put(self, key, value):
if key in self.mp:
node=self.mp[key]
node.value=value
self.add_head_node(node)
else:
node=Node(key=key,value=value)
self.mp[key]=node
if self.full==self.capacity:
old_node=self.remove_tail_node()
del self.mp[old_node.key]
self.add_node(node)
else:
self.full+=1
self.add_node(node)
# Your LRUCache object will be instantiated and called as such:
# obj = LRUCache(capacity)
# param_1 = obj.get(key)
# obj.put(key,value)
179. 最大数
class Solution(object):
def largestNumber(self, nums):
"""
:type nums: List[int]
:rtype: str
"""
nums=[str(num) for num in nums]
for i in range(len(nums)):
for j in range(len(nums)-1-i):
if nums[j]+nums[j+1]<nums[j+1]+nums[j]:
nums[j],nums[j+1]= nums[j+1],nums[j]
if nums[0]=="0":
return "0"
return "".join(nums)
128. 最长连续序列
class Solution(object):
def longestConsecutive(self, nums):
s=set()
for num in nums:
s.add(num)
max_len=0
for num in s:
if num-1 in s:
continue
count=1
x=num+1
while x in s:
count+=1
x+=1
max_len=max(max_len,count)
return max_len
386. 字典序排数
class Solution(object):
def lexicalOrder(self, n):
res=[]
def dfs(cur):
if cur>n:
return
res.append(cur)
for i in range(10):
dfs(cur*10+i)
for i in range(1,10):
dfs(i)
return res
8. 字符串转换整数 (atoi)
class Solution(object):
def myAtoi(self, s):
s=s.strip()
if not s:
return 0
sign=1
i=0
if s[0]=="+":
i=1
elif s[0]=="-":
i=1
sign=-1
INT_MAX=2**31-1
INT_MIN=-2**31
result=0
while i<len(s) and s[i].isdigit():
digit=ord(s[i])-48
if result>(INT_MAX-digit)//10:
return INT_MAX if sign == 1 else INT_MIN
result=result*10+digit
i+=1
return result*sign
110. 平衡二叉树
class Solution(object):
def deep(self,root):
if root:
a=self.deep(root.left)
b=self.deep(root.right)
return max(a,b)+1
return 0
def isBalanced(self, root):
if root:
a=self.deep(root.left)
b=self.deep(root.right)
if abs(a-b)>1:
return False
return self.isBalanced(root.right) and self.isBalanced(root.left)
return True
多数组第 K 小数
class Solution:
def findKthNum(self , arr1 , arr2 , target ):
if len(arr1)==0:
return arr2[target-1]
if len(arr2)==0:
return arr1[target-1]
if target==1:
return min(arr1[0],arr2[0])
i=target//2 if len(arr1)>=target//2 else len(arr1)
j=target-target//2 if len(arr2)>=target-target//2 else len(arr2)
if arr1[i-1]<arr2[j-1]:
return self.findKthNum(arr1[i:],arr2,target-i)
else:
return self.findKthNum(arr1 ,arr2[j:],target-j)
1004. 最大连续1的个数 III
class Solution(object):
def longestOnes(self, nums, k):
left=0
max_length=0
count=0
for right,num in enumerate(nums):
if num==0:
count+=1
if count>k:
while left<=right and count>k:
if nums[left]==0:
count-=1
left+=1
max_length=max(max_length,right-left+1)
return max_length
LCR 135. 报数
class Solution(object):
def countNumbers(self, cnt):
self.res=[]
def dfs(x,length,ans):
if x==length:
self.res.append(int("".join(ans)))
return
start=1 if x==0 else 0
for i in range(start,10):
ans.append(str(i))
dfs(x+1,length,ans)
ans.pop()
for length in range(1,cnt+1):
dfs(0,length,[])
return self.res
322. 零钱兑换
class Solution(object):
def coinChange(self, coins, amount):
dp=[float("inf")]*(amount+1)
dp[0]=0
for i in range(1,amount+1):
for coin in coins:
if i-coin<0:
continue
dp[i]=min(dp[i],dp[i-coin]+1)
return dp[amount] if dp[amount]!=float("inf") else -1
523. 连续的子数组和
class Solution(object):
def checkSubarraySum(self, nums, k):
mp={0:-1}
cur_sum=0
for i,num in enumerate(nums):
cur_sum+=num
if k!=0:
ans=cur_sum%k
else:
ans=cur_sum
if ans in mp :
if i-mp[ans]>=2:
return True
else:
mp[ans]=i
return False
151. 反转字符串中的单词
class Solution(object):
def reverseWords(self, s):
res=[]
i=0
while i<len(s):
while i<len(s) and s[i]==" ":
i+=1
if i==len(s):
break
cur_s=""
while i<len(s) and s[i]!=" ":
cur_s+=s[i]
i+=1
res.append(cur_s)
for i in range(len(res)//2):
res[i],res[len(res)-i-1]=res[len(res)-i-1],res[i]
return " ".join(res)
25. K 个一组翻转链表
class Solution(object):
def reverseKGroup(self, head, k):
length=0
cur=head
while cur:
length+=1
cur=cur.next
group=length//k
dummy=ListNode(next=head)
a,b=dummy,head
while group:
x=k
a.next=None
tail=b
while x:
cur=b.next
b.next=a.next
a.next=b
b=cur
x-=1
a=tail
a.next=b
group-=1
return dummy.next
22. 括号生成
class Solution(object):
def fun(self,left,right,ans):
if left==0 and right==0:
self.res.append("".join(ans[:]))
return
if left !=0:
ans.append('(')
self.fun(left-1,right+1,ans)
ans.pop()
if right!=0:
ans.append(')')
self.fun(left,right-1,ans)
ans.pop()
def generateParenthesis(self, n):
self.res=[]
self.fun(n,0,[])
return self.res
20. 有效的括号
class Solution(object):
def isValid(self, s):
stack=[]
for c in s:
if c=="(" or c=="{" or c=="[":
stack.append(c)
else:
if len(stack)==0:
return False
k=stack.pop()
if c==")" and k!="(":
return False
if c=="}" and k!="{":
return False
if c=="]" and k!="[":
return False
if len(stack)==0:
return True
return False
413. 等差数列划分
class Solution(object):
def numberOfArithmeticSlices(self, nums):
if len(nums)<=2:
return 0
total=0
dp=0
for i in range(2,len(nums)):
if nums[i]-nums[i-1] ==nums[i-1]-nums[i-2]:
dp+=1
total+=dp
else:
dp=0
return total
32. 最长有效括号
class Solution(object):
def longestValidParentheses(self, s):
stack=[-1]
res=0
for i,c in enumerate(s):
if c==")":
stack.pop()
if stack:
res=max(res,i-stack[-1])
else:
stack.append(i)
else:
stack.append(i)
return res
735. 小行星碰撞
class Solution(object):
def asteroidCollision(self, asteroids):
i=0
res=[]
for a in asteroids:
while res and res[-1]>=0 and a<0:
diff=res[-1]+a
if diff<0:
res.pop()
elif diff==0:
res.pop()
a=0
break
else:
a=0
break
if a:
res.append(a)
return res


被折叠的 条评论
为什么被折叠?



