日韩av黄I国产麻豆传媒I国产91av视频在线观看I日韩一区二区三区在线看I美女国产在线I麻豆视频国产在线观看I成人黄色短片

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程语言 > python >内容正文

python

python刷题+leetcode(第三部分)

發布時間:2024/7/23 python 43 豆豆
生活随笔 收集整理的這篇文章主要介紹了 python刷题+leetcode(第三部分) 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

200.最大正方形

思路:與島嶼,水塘不同的是這個相對要規則得多,而不是求連通域,所以動態規劃構造出狀態轉移方程即可

動態規劃 if 0, dp[i][j] =0

if 1, dp[i][j] = min(dp[i-1][j-1],dp[i-1][j],dp[i][j-1])+1

class Solution:def maximalSquare(self, matrix):print('==np.array(matrix):\n', np.array(matrix))h = len(matrix)w = len(matrix[0])max_side = 0dp = [[0 for j in range(w)] for i in range(h)]print('==dp:', np.array(dp))for i in range(h):for j in range(w):if matrix[i][j] == '1' and i>0 and j>0:dp[i][j] = min(dp[i - 1][j - 1], dp[i - 1][j], dp[i][j - 1]) + 1max_side = max(max_side, dp[i][j])elif i==0:dp[i][j] = int(matrix[i][j])max_side = max(max_side, dp[i][j])elif j==0:dp[i][j] = int(matrix[i][j])max_side = max(max_side, dp[i][j])else:passprint('==dp:', np.array(dp))# print(max_side)return max_side**2matrix = [["1", "0", "1", "0", "0"], ["1", "0", "1", "1", "1"], ["1", "1", "1", "1", "1"], ["1", "0", "0", "1", "0"]]sol = Solution() sol.maximalSquare(matrix)

201.統計全為 1 的正方形子矩陣

思路:動態規劃 if 0, dp[i][j] =0

if 1, dp[i][j] = min(dp[i-1][j-1],dp[i-1][j],dp[i][j-1])+1

為1的時候 res自加1,再加上dp[i][j]增加的部分,也可以看成是dp的和

class Solution:def countSquares(self, matrix):print('==np.array(matrix)\n', np.array(matrix))h = len(matrix)w = len(matrix[0])dp = [[0 for i in range(w)] for j in range(h)]print('==np.array(dp):', np.array(dp))res = 0for i in range(h):for j in range(w):if matrix[i][j] == 1 and i > 0 and j > 0:res += 1dp[i][j] = min(dp[i - 1][j - 1], dp[i - 1][j], dp[i][j - 1]) + 1res += dp[i][j] - 1 # 減去1代表增加的矩形個數elif i==0:dp[i][j] = matrix[i][j]if matrix[i][j] == 1:res+=1elif j==0:dp[i][j] = matrix[i][j]if matrix[i][j] == 1:res+=1else:passprint('==np.array(dp):', np.array(dp))print('==after res:', res)return resmatrix = [[0, 1, 1, 1],[1, 1, 1, 1],[0, 1, 1, 1] ] sol = Solution() sol.countSquares(matrix)

202.平方數之和

思路:雙指針 左右收縮即可

class Solution:def judgeSquareSum(self, c: int) -> bool:from math import sqrtright = int(sqrt(c))left = 0while(left <= right):sum_ = left**2 + right**2if (sum_ == c):return Trueelif sum_ > c:right -= 1else:left += 1return False

c++實現:
?

class Solution { public:bool judgeSquareSum(int c) {long left = 0, right = sqrt(c);while(left <= right){long sum_ = left*left + right*right;if(sum_ == c){return true;}else if(sum_ > c){right--;}else{left++;}}return false;} };

203.分發餅干

思路:排序加貪心 先給胃口小的餅干

#思路:排序加貪心 先讓胃口小的孩子滿足 class Solution:def findContentChildren(self, g, s):print('==g:', g)print('==s:', s)g = sorted(g)#孩子s = sorted(s)#餅干res = 0for j in range(len(s)):#遍歷餅干 先給胃口小的分配if res<len(g):if g[res]<=s[j]:res+=1print('==res:', res)return resg = [1,2] s = [1,2,3] # g = [1, 2, 3] # s = [1, 1] sol = Solution() sol.findContentChildren(g, s)

204.三角形最小路徑和

?思路:動態規劃

class Solution:def minimumTotal(self, triangle: List[List[int]]) -> int:for i in range(1, len(triangle)):for j in range(len(triangle[i])):if j == 0:triangle[i][j] = triangle[i-1][j] + triangle[i][j]elif j == i:triangle[i][j] = triangle[i-1][j-1] + triangle[i][j]else:triangle[i][j] = min(triangle[i-1][j-1], triangle[i-1][j]) + triangle[i][j]return min(triangle[-1])

c++:

class Solution { public:int minimumTotal(vector<vector<int>>& triangle) {int h = triangle.size();for(int i = 1; i < triangle.size(); i++){for(int j = 0; j < triangle[i].size(); j++){if(j == 0){triangle[i][j] = triangle[i-1][j] + triangle[i][j];}else if(j == i){triangle[i][j] = triangle[i-1][j-1] + triangle[i][j];}else{triangle[i][j] = min(triangle[i-1][j-1], triangle[i-1][j]) + triangle[i][j];}}}return *min_element(triangle[h - 1].begin(), triangle[h - 1].end());} };

205.同構字符串

思路:hash  構造映射關系

class Solution:def isIsomorphic(self, s: str, t: str) -> bool:if len(s) != len(t):return Falsedic = {}for i in range(len(s)):if s[i] not in dic:#未出現過if t[i] in dic.values():#value已經出現過之前構造的dict中了return Falsedic[s[i]] = t[i]else:#出現過if dic[s[i]]!=t[i]:return Falsereturn True# s = "egg" # t = "add" s="ab" t="aa"sol = Solution() sol.isIsomorphic(s, t)

206.單詞接龍 II

思路:構建圖 然后bfs

class Solution:def findLadders(self, beginWord: str, endWord: str, wordList: List[str]) -> List[List[str]]:cost = {}for word in wordList:cost[word] = float("inf")cost[beginWord] = 0# print('==cost:', cost)# neighbors = collections.defaultdict(list)neighbors = {}ans = []#構建圖for word in wordList:for i in range(len(word)):key = word[:i] + "*" + word[i + 1:]if key not in neighbors:neighbors[key] = []neighbors[key].append(word)else:neighbors[key].append(word)# print('==neighbors:', neighbors)q = collections.deque([[beginWord]])# q = [[beginWord]]# print('====q:', q)#bfswhile q:# path = q.popleft()path = q.pop()# print('===path:', path)cur = path[-1]if cur == endWord:ans.append(path.copy())else:for i in range(len(cur)):new_key = cur[:i] + "*" + cur[i + 1:]if new_key not in neighbors:continuefor neighbor in neighbors[new_key]:# print('==cost[cur] + 1, cost[neighbor]:', cost[cur] + 1, cost[neighbor])if cost[cur] + 1 <= cost[neighbor]:q.append(path + [neighbor])cost[neighbor] = cost[cur] + 1# print('==ans:', ans)return ans

208.最后一塊石頭的重量

思路1:while循環 排序從大到小 一直取前兩塊石頭進行比較

class Solution:def lastStoneWeight(self, stones):while len(stones)>=2:stones = sorted(stones)[::-1]if stones[0]==stones[1]:stones=stones[2:]else:stones = [stones[0]-stones[1]]+stones[2:]print('===stones:', stones)return stones[-1] if len(stones) else 0stones = [2, 7, 4, 1, 8, 1] # stones = [2, 2] sol = Solution() res= sol.lastStoneWeight(stones) print('==res:', res)

更簡潔寫法:

class Solution:def lastStoneWeight(self, stones: List[int]) -> int:while len(stones) >= 2:stones = sorted(stones)stones.append(stones.pop() - stones.pop())return stones[0]

思路2:堆隊列,也稱為優先隊列

import heapq class Solution:def lastStoneWeight(self, stones):h = [-stone for stone in stones]heapq.heapify(h)print('==h:', h)while len(h) > 1:a, b = heapq.heappop(h), heapq.heappop(h)if a != b:heapq.heappush(h, a - b)print('==h:', h)return -h[0] if h else 0stones = [2, 7, 4, 1, 8, 1] # stones = [2, 2] sol = Solution() res= sol.lastStoneWeight(stones) print('==res:', res)

210.無重疊區間

class Solution:def eraseOverlapIntervals(self, intervals):n = len(intervals)if n<=0:return 0intervals = sorted(intervals, key=lambda x: x[-1])print('==intervals:', intervals)res = [intervals[0]]for i in range(1, n):if intervals[i][0] >= res[-1][-1]:res.append(intervals[i])print(res)return n - len(res)# intervals = [[1, 2], [2, 3], [3, 4], [1, 3]] # intervals = [[1,100],[11,22],[1,11],[2,12]] intervals = [[0, 2], [1, 3], [2, 4], [3, 5], [4, 6]] sol = Solution() sol.eraseOverlapIntervals(intervals)

212.種花問題

思路:判斷是否是1或0,1就一種情況,0有兩種情況

100 先判斷1

?01000,要判斷i為0時,i+1是否為1,否則說明就是001這種情況

# 100 先判斷1 # 01000,要判斷i為0時,i+1是否為1,否則說明就是001這種情況 class Solution:def canPlaceFlowers(self, flowerbed, n):i = 0res = 0while i<len(flowerbed):if flowerbed[i]==1:i+=2else:if i+1<len(flowerbed) and flowerbed[i+1]==1:i+=3else:res+=1i+=2return True if res>=n else False# flowerbed = [1,0,0,0,1] # n = 1# flowerbed = [1,0,0,0,1] # n = 2# flowerbed = [1,0,0,0,0,0,1] # n = 2 flowerbed = [1,0,0,0,1,0,0] n = 2 sol = Solution() res= sol.canPlaceFlowers(flowerbed, n) print('==res:', res)

216.較大分組的位置

其實就是再求聚類

思路1:動態規劃

class Solution:def largeGroupPositions(self, s):dp = [0] * len(s)for i in range(1, len(s)):if s[i] == s[i - 1]:dp[i] = 1dp.append(0)print('==dp:', dp)index = [j for j in range(len(dp)) if dp[j] == 0]print('index:', index)res = []for k in range(len(index) - 1):if index[k + 1] - index[k] >= 3:res.append([index[k], index[k + 1] - 1])print('=res:', res)return ress = "abbxxxxzzy" sol = Solution() sol.largeGroupPositions(s)

思路2:雙指針

# 雙指針 class Solution:def largeGroupPositions(self, s):res = []left, right = 0, 0while left < len(s):right = left + 1while right < len(s) and s[right] == s[left]:right += 1if right - left >= 3:res.append([left, right - 1])# 左指針跑到右指針位置left = rightprint('==res:', res)return ress = "abbxxxxzzy" # s = "abcdddeeeeaabbbcd" sol = Solution() sol.largeGroupPositions(s)

217.省份數量

思路:

可以把 n 個城市和它們之間的相連關系看成圖, #

城市是圖中的節點,相連關系是圖中的邊,

?給定的矩陣isConnected 即為圖的鄰接矩陣,省份即為圖中的連通分量。

利用dfs將一個數組view遍歷過的城市置位1。

# dfs # 可以把 nn 個城市和它們之間的相連關系看成圖, # 城市是圖中的節點,相連關系是圖中的邊, # 給定的矩陣isConnected 即為圖的鄰接矩陣,省份即為圖中的連通分量。 class Solution:def travel(self, isConnected, i, n):self.view[i] = 1 # 表示已經遍歷過for j in range(n):if isConnected[i][j] == 1 and not self.view[j]:self.travel(isConnected, j, n)def findCircleNum(self, isConnected):n = len(isConnected)self.view = [0] * nres = 0for i in range(n):if self.view[i] != 1:res += 1self.travel(isConnected, i, n)print('==res:', res)return res# isConnected = [[1, 1, 0], # [1, 1, 0], # [0, 0, 1]] isConnected = [[1,0,0],[0,1,0],[0,0,1]] sol = Solution() sol.findCircleNum(isConnected)

218.旋轉數組

思路1:截斷拼接,注意的是一些邊界條件需要返回原數組

class Solution:def rotate(self, nums: List[int], k: int) -> None:if len(nums)<=1 or k==0 or k%len(nums)==0:return numsn = len(nums)k = k%n# print(nums[-k:]+nums[:n-k])nums[:] = nums[-k:]+nums[:n-k]return nums

思路2:先左翻轉,在右翻轉,在整體翻轉?

class Solution:def reverse(self, i, j, nums):#交換位置的while i < j:#nums[i], nums[j] = nums[j], nums[i]i += 1j -= 1def rotate(self, nums, k):"""Do not return anything, modify nums in-place instead."""n = len(nums)k %= n #有大于n的數self.reverse(0, n - k - 1, nums) #左翻self.reverse(n - k, n - 1, nums) #右翻self.reverse(0, n - 1, nums) #整體翻print(nums)return nums# nums = [1,2,3,4,5,6,7] # k = 3 nums = [1,2,3,4,5,6] k = 11 sol = Solution() sol.rotate(nums, k)

219.匯總區間

思路:雙指針

class Solution:def summaryRanges(self, nums):res = []left =0right = 0while right<len(nums):right = left+1while right<len(nums) and nums[right] - nums[right-1] == 1:right+=1if right -1>left:res.append(str(nums[left]) + "->" + str(nums[right-1]))else:res.append(str(nums[left]))left = rightprint(res)return res nums = [0,1,2,4,5,7] sol = Solution() sol.summaryRanges(nums)

220.冗余連接

思路:并查集

#并查集:合并公共節點的,對相鄰節點不是公共祖先的進行合并 class Solution:def find(self, index): # 查詢if self.parent[index] == index: # 相等就返回return indexelse:return self.find(self.parent[index]) # 一直遞歸找到節點index的祖先def union(self, i, j): # 合并self.parent[self.find(i)] = self.find(j)def findRedundantConnection(self, edges):nodesCount = len(edges)self.parent = list(range(nodesCount + 1))print('==self.parent:', self.parent)for node1, node2 in edges:print('==node1, node2:', node1, node2)if self.find(node1) != self.find(node2):#相鄰的節點公共祖先不一樣就進行合并print('===hahhaha===')self.union(node1, node2)print('=self.parent:', self.parent)else:return [node1, node2]return []edges = [[1, 2], [1, 3], [2, 3]] sol = Solution() res = sol.findRedundantConnection(edges) print('=res:', res)

223.可被 5 整除的二進制前綴

思路:二進制移位 在和5求余

class Solution:def prefixesDivBy5(self, A: List[int]) -> List[bool]:res = [False]*len(A)value = 0for i in range(len(A)):value = (value<<1) + A[i]# print(value)if value%5==0:res[i]=Truereturn res

225.移除最多的同行或同列石頭

思路1:?其實主要是算連通域的個數,當滿足同行或者同列就算聯通,
?輸出的結果就是石頭個數減去連通域個數,第一種解法超時

# 其實主要是算連通域的個數,當滿足同行或者同列就算聯通, # 輸出的結果就是石頭個數減去連通域個數 #第一種直接dfs會超時 import numpy as np class Solution:def dfs(self, rect, i, j, h, w):if i < 0 or i >= h or j < 0 or j >= w or rect[i][j] != 1:returnrect[i][j] = -1for i_ in range(h):self.dfs(rect, i_, j, h, w)for j_ in range(w):self.dfs(rect, i, j_, h, w)def removeStones(self, stones):n = 10rect = [[0 for _ in range(n)] for _ in range(n)]print(len(rect))for stone in stones:rect[stone[0]][stone[-1]] = 1print('before np.array(rect):', np.array(rect))h, w = n, ngraphs = 0for i in range(h):for j in range(w):if rect[i][j] == 1:graphs += 1self.dfs(rect, i, j, h, w)print('after np.array(rect):', np.array(rect))print(graphs)return len(stones) - graphsstones = [[0, 0], [0, 1], [1, 0], [1, 2], [2, 1], [2, 2]] sol = Solution() res = sol.removeStones(stones) print('===res:', res)

思路2:并查集

class Solution:# 并查集查找def find(self, x):if self.parent[x] == x:return xelse:return self.find(self.parent[x])#合并def union(self,i, j):self.parent[self.find(i)] = self.find(j)def removeStones(self, stones):# 因為x,y所屬區間為[0,10^4]# n = 10001n = 10self.parent = list(range(2 * n))for i, j in stones:self.union(i, j + n)print('==self.parent:', self.parent)# 獲取連通區域的根節點res = []for i, j in stones:res.append(self.find(i))print('=res:', res)return len(stones) - len(set(res))stones = [[0, 0], [0, 1], [1, 0], [1, 2], [2, 1], [2, 2]] sol = Solution() res = sol.removeStones(stones) print('===res:', res)

226..綴點成線

思路:判斷斜率 將除換成加

class Solution:def checkStraightLine(self, coordinates):n = len(coordinates)for i in range(1, n-1):if (coordinates[i+1][1]-coordinates[i][1])*(coordinates[i][0]-coordinates[i-1][0])=(coordinates[i][1]-coordinates[i-1][1])*(coordinates[i+1][0]-coordinates[i][0]):return Falsereturn Truecoordinates = [[1,2],[2,3],[3,4],[4,5],[5,6],[6,7]] sol = Solution() sol.checkStraightLine(coordinates)

227.賬戶合并

思路:并查集

#思想是搜索每一行的每一個郵箱,如果發現某一行的某個郵箱在之前行出現過,那么把該行的下標和之前行通過并查集來合并, class Solution(object):def find(self, x):if x == self.parents[x]:return xelse:return self.find(self.parents[x])def union(self,i, j):self.parents[self.find(i)] = self.find(j)def accountsMerge(self, accounts):# 用parents維護每一行的父親節點# 如果parents[i] == i, 表示當前節點為根節點self.parents = [i for i in range(len(accounts))]print('==self.parents:', self.parents)dict_ = {}# 如果發現某一行的某個郵箱在之前行出現過,那么把該行的index和之前行合并(union)即可for i in range(len(accounts)):for email in accounts[i][1:]:if email in dict_:self.union(dict_[email], i)else:dict_[email] = iprint('===self.parents:', self.parents)print('=== dict_:', dict_)import collectionsusers = collections.defaultdict(set)print('==users:', users)res = []# 1. users:表示每個并查集根節點的行有哪些郵箱# 2. 使用set:避免重復元素# 3. 使用defaultdict(set):不用對每個沒有出現過的根節點在字典里面做初始化for i in range(len(accounts)):for account in accounts[i][1:]:users[self.find(i)].add(account)print('==users:', users)# 輸出結果的時候注意結果需按照字母順序排序(雖然題目好像沒有說)for key, val in users.items():res.append([accounts[key][0]] + sorted(list(val)))return resaccounts = [["John", "johnsmith@mail.com", "john00@mail.com"],["John", "johnnybravo@mail.com"],["John", "johnsmith@mail.com", "john_newyork@mail.com"],["Mary", "mary@mail.com"]]# [["John", 'john00@mail.com', 'john_newyork@mail.com', 'johnsmith@mail.com'], # ["John", "johnnybravo@mail.com"], # ["Mary", "mary@mail.com"]]sol = Solution() res= sol.accountsMerge(accounts) print(res)

228.連接所有點的最小費用

思路1: 其實就是求最小生成樹,首先想到的是kruskal 但是時間復雜度較高,超時

# 其實就是求最小生成樹:采用kruskal 但是時間復雜度較高,超時 class Solution:def minCostConnectPoints(self, points):edge_list = []nodes = len(points)for i in range(nodes):for j in range(i):dis = abs(points[i][0] - points[j][0]) + abs(points[i][1] - points[j][1])edge_list.append([i, j, dis])print('==edge_list:', edge_list)edge_list = sorted(edge_list, key=lambda x: x[-1])print('==edge_list:', edge_list)group = [[i] for i in range(nodes)]print('==group:', group)res = 0for edge in edge_list:for i in range(len(group)):if edge[0] in group[i]:m = i # 開始節點if edge[1] in group[i]:n = i # 結束節點if m != n:# res.append(edge)res += edge[-1]group[m] = group[m] + group[n]group[n] = []print(group)print('==res:', res)return respoints = [[0, 0], [2, 2], [3, 10], [5, 2], [7, 0]] sol = Solution() sol.minCostConnectPoints(points)

思路2: 其實就是求最小生成樹,首先想到的是prim 但是時間復雜度較高,超時

# prim算法 超出時間限制 class Solution:def minCostConnectPoints(self, points):# edge_list = []nodes = len(points)Matrix = [[0 for i in range(nodes)] for j in range(nodes)]for i in range(nodes):for j in range(nodes):dis = abs(points[i][0] - points[j][0]) + abs(points[i][1] - points[j][1])# edge_list.append([i, j, dis])Matrix[i][j] = dis# print('===edge_list:', edge_list)print('==Matrix:', Matrix)selected_node = [0]candidate_node = [i for i in range(1, nodes)] # 候選節點print('==candidate_node:', candidate_node)# res = []res = 0while len(candidate_node):begin, end, minweight = 0, 0, float('inf')for i in selected_node:for j in candidate_node:if Matrix[i][j] < minweight:minweight = Matrix[i][j]begin = i # 存儲開始節點end = j # 存儲終止節點# res.append([begin, end, minweight])print('==end:', end)res += minweightselected_node.append(end) # 找到權重最小的邊 加入可選節點candidate_node.remove(end) # 候選節點被找到 進行移除print('==res:', res)return respoints = [[0, 0], [2, 2], [3, 10], [5, 2], [7, 0]] # points = [[-1000000, -1000000], [1000000, 1000000]] sol = Solution() sol.minCostConnectPoints(points)

思路3:并查集

class Solution:def find(self, x):if self.parents[x] == x:return xelse:return self.find(self.parents[x]) # 一直找到幫主def union(self, i, j): # 替換為幫主 站隊self.parents[self.find(i)] = self.find(j)def minCostConnectPoints(self, points):costs_list = []n = len(points)for i in range(n):for j in range(i + 1, n):dis = abs(points[i][0] - points[j][0]) + abs(points[i][1] - points[j][1])costs_list.append([dis, i, j])# print('==costs_list:', costs_list)costs_list = sorted(costs_list, key=lambda x: x[0])print('==costs_list:', costs_list)self.parents = [i for i in range(n)]print('==init self.parents:', self.parents)res = 0for i in range(len(costs_list)):dis, x, y = costs_list[i]if self.find(x) != self.find(y):self.union(x, y)print('==x,y:', x, y)print('==self.parents:', self.parents)res += disprint('==res:', res)return respoints = [[0, 0], [2, 2], [3, 10], [5, 2], [7, 0]] sol = Solution() sol.minCostConnectPoints(points)

229.正則表達式匹配

思路:字符串的匹配問題,自然想到用dp,做成二維矩陣方便進行狀態方程的轉移

f[i][j]:s的前i個字符和p的前j個字符是否相等
p的第j個字符是字母:p[j]==s[i]時 ,f[i][j]=f[i-1][j-1]
p的第j個字符是字母:p[j]!=s[i]時 ,f[i][j]=False

p的第j個字符是*:s[i]==p[j-1],f[i][j]=f[i-1][j] or f[i][j-2]
p的第j個字符是*:s[i]!=p[j-1],f[i][j]=f[i][j-2]

#f[i][j]:s的前i個字符和p的前j個字符是否相等 #p的第j個字符是字母:p[j]==s[i]時 ,f[i][j]=f[i-1][j-1] #p的第j個字符是字母:p[j]!=s[i]時 ,f[i][j]=False#p的第j個字符是*:s[i]==p[j-1],f[i][j]=f[i-1][j] or f[i][j-2] #p的第j個字符是*:s[i]!=p[j-1],f[i][j]=f[i][j-2] class Solution:def match(self, i, j, s, p):if i == 0:return Falseif p[j - 1] == '.':return Truereturn s[i - 1] == p[j - 1]def isMatch(self, s, p):m, n = len(s), len(p)f = [[False] * (n + 1) for _ in range(m + 1)]f[0][0] = Truefor i in range(m + 1):for j in range(1, n + 1):if p[j - 1] == '*':# f[i][j] = f[i][j] or f[i][j - 2]if self.match(i, j - 1, s, p):f[i][j] = f[i - 1][j] or f[i][j-2]else:f[i][j] = f[i][j - 2]else:if self.match(i, j, s, p):f[i][j] = f[i - 1][j - 1]else:f[i][j] = Falseprint('==f:', f)return f[m][n]s = "aa" p = "a" sol = Solution() sol.isMatch(s, p)

230.最長回文子串

思路:中心枚舉,雙指針,需要注意的是有上述兩種情況,左右指針的索引有兩種

class Solution:def help(self, left, right, s, n):while left >= 0 and right < n:if s[left] == s[right]:left -= 1right += 1else:breaktemp = s[left+1:right]self.res = max(self.res, temp, key=len)def longestPalindrome(self, s):self.res = s[0]n = len(s)for i in range(1, n):self.help(i-1, i+1, s, n)#針對"babad"self.help(i - 1, i, s, n)#針對"cbbd"print('==self.res:', self.res)return self.res# s = "babad" s = "cbbd" sol = Solution() sol.longestPalindrome(s)

231.尋找兩個正序數組的中位數

思路:雙指針,走完剩下的在進行合并

class Solution:def findMedianSortedArrays(self, nums1, nums2):res = []i, j = 0, 0m, n = len(nums1), len(nums2)while i < m and j < n:if nums1[i] < nums2[j]:res.append(nums1[i])i += 1else:res.append(nums2[j])j += 1print('==res:', res)print('==i:', i)print('==j:', j)if i < m:res.extend(nums1[i:])if j < n:res.extend(nums2[j:])print('==res:', res)if (m+n)%2==0:#偶數return (res[(m+n)//2]+res[(m+n)//2-1])/2else:#奇數return res[(m+n)//2]# nums1 = [1, 1, 3] # nums2 = [2] nums1 = [1,2] nums2 = [3,4] sol = Solution() res = sol.findMedianSortedArrays(nums1, nums2) print(res)

232.連通網絡的操作次數

思路:并查集 其實就是求當前的聯通量個數減去一個聯通量的值,對于n個節點,要給n-1條邊才會滿足都能連上,采用并查集去做聚類,否則就不滿足了

class Solution:def find(self, x):if x==self.parent[x]:return xelse:return self.find(self.parent[x])def union(self,x,y):#將x的老大換成y的老大self.parent[self.find(x)] = self.find(y)def makeConnected(self, n, connections):if len(connections) < n - 1:return -1self.parent = [i for i in range(n)]clusters = nfor connection in connections:x, y = connectionif self.find(x)!=self.find(y):clusters-=1self.union(x, y)print('==x,y', x, y)print('==self.parent:', self.parent)print(clusters)return clusters-1n = 4 connections = [[0,1],[0,2],[1,2]] sol = Solution() sol.makeConnected(n, connections)

234.最長連續遞增序列

思路:棧

class Solution:def findLengthOfLCIS(self, nums):stack = []res = 0for i in range(len(nums)):if stack and nums[i]<=stack[-1]:stack=[]stack.append(nums[i])res = max(len(stack), res)# print('==stack:', stack)# print(res)return res nums = [1, 3, 5, 4, 7] sol = Solution() sol.findLengthOfLCIS(nums)

235.由斜杠劃分區域

思路;把斜線換成3*3網格,就變成水域問題了

import numpy as npclass Solution:def dfs(self, i, j, h, w, matrix):if i < 0 or j < 0 or i >= h or j >= w or matrix[i][j] != 0:returnmatrix[i][j] = -1self.dfs(i - 1, j, h, w, matrix)self.dfs(i, j - 1, h, w, matrix)self.dfs(i + 1, j, h, w, matrix)self.dfs(i, j + 1, h, w, matrix)def regionsBySlashes(self, grid):n = len(grid)matrix = [[0 for _ in range(3 * n)] for _ in range(3 * n)]print(np.array(matrix))for i in range(n):for j in range(len(grid[i])):if grid[i][j] == '/':matrix[i * 3][j * 3 + 2] = matrix[i * 3 + 1][j * 3 + 1] = matrix[i * 3 + 2][j * 3] = 1elif grid[i][j] == '\\':matrix[i * 3 + 2][j * 3 + 2] = matrix[i * 3 + 1][j * 3 + 1] = matrix[i * 3][j * 3] = 1print(np.array(matrix))res = 0for i in range(3 * n):for j in range(3 * n):if matrix[i][j] == 0:res+=1self.dfs(i, j, 3 * n, 3 * n, matrix)print('==res:', res)return res# grid = [" /", "/ "] grid = ["/\\", "/\\"] sol = Solution() sol.regionsBySlashes(grid)

要注意的是如果格子用2*2,會出現這種0不會挨著的,會出錯

236.等價多米諾骨牌對的數量

思路1;

兩層循環 超時

class Solution:def numEquivDominoPairs(self, dominoes):#兩層循環 超時n = len(dominoes)left, right = 0, 0res=0while left<n:right=left+1while right<n:if dominoes[right]==dominoes[left][::-1] or dominoes[right]==dominoes[left]:res+=1right+=1left+=1print('==res:', res)return res

思路2:做成字典,記錄相同的個數,兩兩之間相互組合為n*(n-1)/2

class Solution:def numEquivDominoPairs(self, dominoes):# 字典法ans = 0dict_ = {}for d1, d2 in dominoes:# 排序后加入字典index = tuple(sorted((d1, d2)))if index in dict_:dict_[index] += 1else:dict_[index] = 1print('==dict_:', dict_)# 計算答案for i in dict_:#n*n(-1)/2ans += dict_[i] * (dict_[i] - 1) // 2return ans

思路3:桶計數,兩兩之間相互組合為n*(n-1)/2

class Solution:def numEquivDominoPairs(self, dominoes): #桶裝法nums = [0]*100res = 0for dominoe in dominoes:x,y = dominoeif x>y:nums[x*10+y] +=1else:nums[y * 10 + x] += 1for num in nums:if num>=2:res += num*(num-1)//2print(res)return res

239.尋找數組的中心索引

class Solution:def pivotIndex(self, nums):n = len(nums)for i in range(n):left_sum = sum(nums[:i])right_sum = sum(nums[i+1:])if left_sum == right_sum:return ireturn -1nums = [1, 7, 3, 6, 5, 6] sol = Solution() res = sol.pivotIndex(nums) print(res)

240.最小體力消耗路徑

思路1:咋一眼看過去,以為直接用dp就行,但是真正在寫的過程中,發現消耗的最小體力沒有狀態轉移方程,所以可不可以看成先初始化給一個體力值,如果能達到右下腳,將體力值減少,而這個減少的過程采用二分法這樣減少更快

代碼注釋的部分使用list會超時,換成集合就好了,不會超時

# 思路:二分法,先給定一個初始體力值,能夠走到的話,就減少體力,否則增加體力 class Solution:def minimumEffortPath(self, heights):h, w = len(heights), len(heights[0])left_value, right_value, res = 0, 10 ** 6 - 1, 0# 二分法while left_value <= right_value: # 終止條件 找到合適的體力值mid = left_value + (right_value - left_value) // 2# start_point = [[0, 0]]# seen = [[0, 0]]start_point = [(0, 0)]seen = {(0, 0)}while start_point:x, y = start_point.pop(0)for x_, y_ in [(x - 1, y), (x + 1, y), (x, y - 1), (x, y + 1)]:# 不超過范圍 也沒見過 差值也小與給定的體力值# if 0 <= x_ < h and 0 <= y_ < w and [x_, y_] not in seen and abs(# heights[x][y] - heights[x_][y_]) <= mid:# start_point.append([x_, y_])# seen.append([x_, y_])if 0 <= x_ < h and 0 <= y_ < w and (x_, y_) not in seen and abs(heights[x][y] - heights[x_][y_]) <= mid:start_point.append((x_, y_))seen.add((x_, y_))print('==seen:', seen)if (h - 1, w - 1) in seen: # 足夠到底右下角,說明體力足夠,那么繼續減少體力res = midright_value = mid - 1else: # 到不了右下角,說明體力不夠,需要增加體力left_value = mid + 1return resheights = [[1, 2, 2],[3, 8, 2],[5, 3, 5]] sol = Solution() res = sol.minimumEffortPath(heights) print('==res:', res)

思路2:并查集
將節點與節點之間的邊與權重構建出來
按權重從小到大 不斷合并 只要出現從起始點到終止點能夠到達 說明找到了 此時的值就是最大消耗體力值

#思路:并查集 #將節點與節點之間的邊與權重構建出來 #按權重從小到大 不斷合并 只要出現從起始點到終止點能夠到達 說明找到了 此時的值就是最大消耗體力值 class Solution:def find(self, x):if x==self.parent[x]:return xelse:return self.find(self.parent[x])def union(self, x, y):#將y的老大換成x的老大x = self.find(x)y = self.find(y)if x == y:return Falseif self.size[x]<self.size[y]:x, y = y, xself.parent[y] = xself.size[x] += self.size[y]#x的老大進行計數 看哪邊人多 那邊人多 就歸屬def connect(self,x, y):x,y = self.find(x),self.find(y)return x==ydef minimumEffortPath(self, heights):h, w = len(heights), len(heights[0])self.parent = [i for i in range(h*w)]self.size = [1 for _ in range(h*w)]edges = []#構建 節點和節點之間的邊和權重for i in range(h):for j in range(w):index = i*w+jif i>0:edges.append((index-w, index, abs(heights[i][j]-heights[i-1][j])))#減去一行的寬度 回到上一行 也就是豎線的邊if j>0:edges.append((index-1,index,abs(heights[i][j]-heights[i][j-1])))#減去左邊一格 回到左邊 也就是橫線的邊print('==edges:', edges)print(len(edges))edges = sorted(edges, key=lambda x: x[2])#按權重重小到大排序print('==edges:', edges)res = 0for x, y, value in edges:self.union(x, y)#把y的老大換成x的老大print('==self.parent:', self.parent)print('==self.size:', self.size)if self.connect(0, h*w-1):res = valuebreakprint('==res:', res)return resheights = [[1, 2, 2],[3, 8, 2],[5, 3, 5]] # heights = [[4,3,4,10,5,5,9,2], # [10,8,2,10,9,7,5,6], # [5,8,10,10,10,7,4,2], # [5,1,3,1,1,3,1,9], # [6,4,10,6,10,9,4,6]] sol = Solution() res = sol.minimumEffortPath(heights) print('==res:', res)

241.不用加減乘除做加法

思路:分為進位和 當前位的異或

class Solution:def add(self, a: int, b: int) -> int:add_flag = (a&b)<<1;#進位在左移sum_ = a^b;#異或 取值 相同為0 不同為1return sum_+add_flag

242.水位上升的泳池中游泳

堆隊列 也稱為優先隊列 就是根節點的值最小

思路:采用bfs + 堆隊列? 保證能到達左下角的時候 需要最小的時間

# 堆隊列 也稱為優先隊列 就是根節點的值最小 # 思路:采用dfs + 堆隊列 import heapqclass Solution:def swimInWater(self, grid):h, w = len(grid), len(grid[0])res = 0heap = [(grid[0][0], 0, 0)]visited = {(0, 0)}while heap:print('===heap:', heap)height, x, y = heapq.heappop(heap)res = max(res, height)if x == w - 1 and y == h - 1:return resfor dx, dy in ((0, 1), (0, -1), (1, 0), (-1, 0)):new_x, new_y = x + dx, y + dyif 0 <= new_x < w and 0 <= new_y < h and (new_x, new_y) not in visited:visited.add((new_x, new_y))heapq.heappush(heap, (grid[new_x][new_y], new_x, new_y))return -1grid = [[0, 2],[1, 3]] # grid = [[0, 1, 2, 3, 4], # [24, 23, 22, 21, 5], # [12, 13, 14, 15, 16], # [11, 17, 18, 19, 20], # [10, 9, 8, 7, 6]] sol = Solution() sol.swimInWater(grid)

243.從相鄰元素對還原數組

思路:構建字典,進行bfs遍歷 依次對出現過一次的字符 添加進列表即可

#bfs class Solution():def restoreArray(self, adjacentPairs):""":type adjacentPairs: List[List[int]]:rtype: List[int]"""import collectionsmemory = collections.defaultdict(list)for x,y in adjacentPairs:memory[x].append(y)memory[y].append(x)print('==memory:', memory)res = []visited = set()queue = []for key, value in memory.items():if len(value) == 1:queue.append((key, value[0]))while queue:print('==queue:', queue)start, end = queue.pop()res.append(start)print('==res:', res)visited.add(start)for num in memory[end]:if num in visited:continuequeue.append((end, num))return resadjacentPairs = [[2,1],[3,4],[3,2]] # # adjacentPairs = [[4,-2], # # [1,4], # # [-3,1]] # # adjacentPairs = [[100000,-100000]] # adjacentPairs =[[4,-10], # [-1,3], # [4,-3], # [-3,3]] sol = Solution() ress= sol.restoreArray(adjacentPairs) print(ress)

246.公平的糖果棒交換

#思路1:兩層for循環 超時

#思路1:兩層for循環 超時 class Solution:def fairCandySwap(self, A, B):sum_A = sum(A)sum_B = sum(B)target = (sum_A+sum_B)//2for i in range(len(A)):for j in range(len(B)):if sum(A[:i])+sum(A[i+1:])+B[j] == target:return [A[i], B[j]]return []# A = [1, 2] # B = [2, 3] A = [1 ,2, 5] B = [2, 4] sol = Solution() res = sol.fairCandySwap(A, B) print(res)

?思路2:雙指針 利用?sumA-x+y = sumB+x-y -->(sumA-sumB)/2 = x-y? 轉換為尋找兩個元素

#思路1:#sumA-x+y = sumB+x-y -->(sumA-sumB)/2 = x-y # 故用雙指針 轉換為二分查找 去查找兩數之差 class Solution:def fairCandySwap(self, A, B):i = 0j = 0A = sorted(A)B = sorted(B)sum_A = sum(A)sum_B = sum(B)target = (sum_A-sum_B)/2print('==target:', target)while i<len(A) and j<len(B):if (A[i] - B[j]) == target:return [A[i], B[j]]elif (A[i] - B[j])>target:j+=1else:i+=1return []# A = [1, 2] # B = [2, 3] A = [1,2,5] B = [2,4] sol = Solution() res = sol.fairCandySwap(A, B) print(res)

思路3:一層for循環?利用?sumA-x+y = sumB+x-y -->(sumA-sumB)/2 = x-y? 轉換為尋找兩個元素

#思路2:#sumA-x+y = sumB+x-y -->(sumA-sumB)/2 = x-y # 一層for循環走遍 class Solution:def fairCandySwap(self, A, B):sum_A = sum(A)sum_B = sum(B)target = (sum_A-sum_B)//2for num in B:if num+target in A:return [num+target, num]return []A = [1, 2] B = [2, 3] # A = [1 ,2, 5] # B = [2, 4] sol = Solution() res = sol.fairCandySwap(A, B) print(res)

247.替換后的最長重復字符

思路:如果k==0其實就是求最長字符串 ,k大于0,那么采用滑動窗口的方式 對左右指針求最少字符(也可能是不同字符)個數

如果最少字符個數大于k說明 左指針該右移動了,否則右指針一直在右移

# 思路:如果k==0其實就是求最長字符串 ,k大于0,那么采用滑動窗口的方式 對左右指針求最少字符個數 # 如果最少字符個數大于k說明 左指針改右移動了,否則右指針一直在右移 class Solution:def characterReplacement(self, s, k):left, right = 0, 0nums = [0] * 26# max_num = 0res = 0while right < len(s):nums[ord(s[right]) - ord('A')] += 1max_num = max(nums)#減去max_num 就是 求左右指針內最少字符(也可能是不同字符)個數while right - left + 1 - max_num > k:nums[ord(s[left]) - ord('A')] -= 1left += 1right += 1res = max(right - left, res)print('==res:', res)return res# s = "ABAB" # k = 2 s = "AABABBA" k = 1 sol = Solution() res = sol.characterReplacement(s, k) print('==res:', res)

250.子數組最大平均數 I

思路1:采用list和 ,超時

class Solution:def findMaxAverage(self, nums, k):res = float('-inf')for i in range(len(nums)-k+1):res = max(sum(nums[i:i+k]), res)print(res)return res/knums = [1, 12, -5, -6, 50, 3] k = 4 sol = Solution() sol.findMaxAverage(nums, k)

思路2:采用前綴和,空間換時間

class Solution:def findMaxAverage(self, nums, k):length =len(nums)pre_sum = [0]*lengthpre_sum[0] = nums[0]for i in range(1, length):pre_sum[i] = pre_sum[i-1]+nums[i]print('===pre_sum:', pre_sum)res = float('-inf')for i in range(k-1, length):if i > k-1:res = max(res, pre_sum[i] - pre_sum[i-k])else:res = pre_sum[i]print('==res:', res)return res/knums = [1, 12, -5, -6, 50, 3] k = 4 sol = Solution() res = sol.findMaxAverage(nums, k) print('==res:', res)

思路3:雙指針

class Solution:def findMaxAverage(self, nums, k):length = len(nums)Sum = 0res = float('-inf')left,right=0,0while right<length:Sum += nums[right]if right>=k-1:res =max(res, Sum)print('==res:', res)Sum-=nums[left]left += 1right+=1return res/knums = [1, 12, -5, -6, 50, 3] k = 4 sol = Solution() res = sol.findMaxAverage(nums, k) print('==res:', res)

251.盡可能使字符串相等

思路;轉換成距離列表后進行雙指針滑動窗口即可

#雙指針 class Solution:def equalSubstring(self, s, t, maxCost):length = len(s)dist_cost = [0] * lengthfor i in range(length):dist_cost[i] = abs(ord(s[i]) - ord(t[i]))print('==dist_cost:', dist_cost)res = 0left,right =0,0Sum = 0while right<length:Sum+=dist_cost[right]if Sum>maxCost:Sum -= dist_cost[left]left+=1right+=1res = max(res, right - left)print(res)return res # s = "abcd" # t = "bcdf" # cost = 3 # s = "abcd" # t = "acde" # cost = 0 s = "krrgw" t = "zjxss" cost = 19 # s = "abcd" # t = "cdef" # cost = 3 sol = Solution() sol.equalSubstring(s, t, cost)

261.可獲得的最大點數

思路:轉換為求連續的和最小, 那么自然用滑動窗口解決即可以

class Solution:def maxScore(self, cardPoints, k):length = len(cardPoints)leaving_k = length - kprint('==leaving_k:', leaving_k)if leaving_k == 0:return sum(cardPoints)left, right = 0, 0min_res = float('inf')temp_res = 0while right < length:temp_res += cardPoints[right]if right >= leaving_k - 1:min_res = min(min_res, temp_res)print('==temp_res:', temp_res)left += 1temp_res -= cardPoints[left - 1]right += 1print('==min_res:', min_res)return sum(cardPoints) - min_rescardPoints = [1, 2, 3, 4, 5, 6, 1] k = 3 # cardPoints = [9, 7, 7, 9, 7, 7, 9] # k = 7 sol = Solution() sol.maxScore(cardPoints, k)

262.非遞減數列

思路:分別從左右兩邊判斷是否遞增

class Solution:def checkPossibility(self, nums: List[int]) -> bool:length = len(nums)# res = 0left,right = 0,length-1while left<length-1 and nums[left]<=nums[left+1]:left+=1if left==length-1:return Truewhile right>=0 and nums[right-1]<=nums[right]:right-=1if right - left>1:return Falseif left==0 or right==length-1:return Trueif nums[right+1]>=nums[left] or nums[left-1]<=nums[right]:return Truereturn False

264.最長湍流子數組

思路:雙指針

滿足山峰:arr[right]>arr[right-1] and arr[right]>arr[right+1]? right+=1

滿足山谷:arr[right]

其他時候 left移動到right位置

class Solution:def maxTurbulenceSize(self, arr):left, right = 0, 0length = len(arr)res = 1while right<length-1:if left==right:if left+1<length and arr[left]==arr[left+1]:left+=1right+=1else:#山峰if right+1<length and arr[right]>arr[right-1] and arr[right]>arr[right+1]:right+=1# 山谷elif right+1<length and arr[right]<arr[right-1] and arr[right]<arr[right+1]:right+=1else:left=rightprint('==right:', right)res = max(res, right-left+1)print('==res:', res)return res# arr = [9,4,2,10,7,8,8,1,9] # arr = [100] arr = [2,1] sol = Solution() sol.maxTurbulenceSize(arr)


267.數據流中的第 K 大元素

思路1:每個add進去 就sort取第k大,時間復雜度偏大k*log(k),對于這種取topk問題,用最小堆更合適

#k*O(logk) 超時 class KthLargest:def __init__(self, k, nums):self.k = kself.nums = numsdef add(self, val):self.nums.append(val)self.nums = sorted(self.nums)[::-1]return self.nums[self.k - 1] k = 3 nums = [4, 5, 8, 2] sol = KthLargest(k, nums) res = sol.add(3) print('=res:', res) res = sol.add(5) print('=res:', res) res = sol.add(10) print('=res:', res) res = sol.add(9) print('=res:', res) res = sol.add(4) print('=res:', res)

思路2:最小堆,保證最小堆中只有k個元素,那么堆頂自然就是第k大元素

時間復雜度為log(k),因為push和pop都是log(k).

python代碼

# 最小堆 topk都用最小堆 import heapq class KthLargest(object):def __init__(self, k, nums):""":type k: int:type nums: List[int]"""self.k = kself.que = numsheapq.heapify(self.que)def add(self, val):""":type val: int:rtype: int"""heapq.heappush(self.que, val)print('=====self.que====:', self.que)while len(self.que)>self.k:#保持最小堆中只有k個元素 則堆頂就是第k大元素heapq.heappop(self.que)print('clean self.que:', self.que)return self.que[0]k = 3 nums = [4, 5, 8, 2] sol = KthLargest(k, nums) res = sol.add(3) print('=res:', res) res = sol.add(5) print('=res:', res)

c++代碼:

#include <map> #include <vector> #include <iostream> #include <queue> using namespace std;class KthLargest { public:priority_queue<int, vector<int>, greater<int> > que;//最小堆int k;KthLargest(int k, vector<int>& nums) {this->k = k;for(int k=0;k<nums.size();k++){que.push(nums[k]);if (que.size()>this->k){que.pop();}}}int add(int val) {que.push(val);if(que.size()>this->k){que.pop();}return que.top();} };int main() { int k=3;vector<int> nums;nums={4,5,8,2};KthLargest *p = new KthLargest(k, nums);int res = p->add(3);cout<<"res:"<<res<<endl;res = p->add(5);cout<<"res:"<<res<<endl;res = p->add(10);cout<<"res:"<<res<<endl;res = p->add(9);cout<<"res:"<<res<<endl;res = p->add(4);cout<<"res:"<<res<<endl;delete p;p=NULL;return 0;}

269.楊輝三角 II

思路:一層一層遍歷出值即可

python代碼:

class Solution:def getRow(self, rowIndex: int) -> List[int]:temp = [0]*(rowIndex+1)temp[0] = 1for i in range(1, rowIndex+1):for j in range(i, 0, -1):temp[j] += temp[j-1]# print('==temp:', temp)return temp

c++代碼:

#include <map> #include <vector> #include <iostream> #include <queue> #include <algorithm> using namespace std; class Solution { public:vector<int> getRow(int rowIndex) {vector<int> temp(rowIndex+1, 0);temp[0] = 1;for (int i=1;i<rowIndex+1;i++){for(int j=i;j>0;j--){temp[j]+=temp[j-1];} }return temp;} };int main() { Solution *p = new Solution();int row_index = 3;vector <int> res;res = p->getRow(row_index);for(int k=0;k<res.size();k++){cout<<"res[k]"<<res[k]<<endl;}p=NULL;delete p;return 0; }

271.找到所有數組中消失的數字

思路1:hash??空間復雜度 o(n) 時間復雜度o(n)

# 空間復雜度 o(n) 時間復雜度o(n) class Solution:def findDisappearedNumbers(self, nums):dict_={}for i in range(len(nums)):dict_[nums[i]] = dict_.get(nums[i],0)+1res = []for i in range(len(nums)):if i+1 not in dict_:res.append(i+1)print(res)return res

思路2:求出索引在對應位置處 添加長度 如果沒有的數字,則數字就小于等于長度

空間復雜度O(1) 時間復雜度O(n)

#空間復雜度O(1) 時間復雜度O(n) class Solution:def findDisappearedNumbers(self, nums):length = len(nums)for i in range(len(nums)):index= (nums[i]-1)%lengthnums[index] +=lengthprint('==nums:', nums)res = [i+1 for i in range(length) if nums[i] <= length]print(res)return res# nums = [4,3,2,7,8,2,3,1] nums = [1,2,2,3,3,4,7,8] # nums = [1,2,3,3,5,6,7] sol = Solution() sol.findDisappearedNumbers(nums)

c++代碼:

#include <map> #include <vector> #include <iostream> #include <queue> #include <string> #include <algorithm> using namespace std; class Solution { public:vector<int> findDisappearedNumbers(vector<int>& nums) {vector<int> res;for (int i=0;i<nums.size();i++){int index = (nums[i]-1)%nums.size();nums[index] += nums.size();}for (int i=0;i<nums.size();i++){if(nums[i]<=nums.size()){res.push_back(i+1);}}return res;} };int main() {Solution *p = new Solution();vector <int >nums;nums = {4,3,2,7,8,2,3,1};vector <int> res = p->findDisappearedNumbers(nums);for(int i=0;i<res.size();i++){cout<<"res:"<<res[i]<<endl; }delete p;p = NULL;return 0; }

?272.情侶牽手

思路:其實就是將環拆開,0,1都看成第0對,2,3看成第1對

可看出要交換的座位就是環的邊數減去1,對于這種去環問題,自然想到并查集

python代碼:

class Solution:def find(self,x):if self.parent[x]==x:return xreturn self.find(self.parent[x])def union(self,i,j):#將i的老大變成j的老大self.parent[self.find(i)] = self.find(j)def get_count(self,n):for i in range(n):self.count[self.find(i)]+=1def minSwapsCouples(self, row):n = len(row)//2self.parent = [i for i in range(n)]self.count = [0 for i in range(n)]print('===init self.parent', self.parent)for i in range(0, len(row), 2):self.union(row[i]//2, row[i+1]//2)print('==self.parent:', self.parent)self.get_count(n)print('===self.count:', self.count)res = 0for i in range(n):res += max(self.count[i]-1, 0)print(res)return res# row = [0,2,2] # row = [0, 2, 1, 3] # row = [2,0,5,4,3,1] row = [1,4,0,5,8,7,6,3,2,9] # row = [0, 1, 2, 3] sol = Solution() sol.minSwapsCouples(row)

c++代碼:

#include <map> #include <vector> #include <iostream> #include <queue> #include <string> #include <algorithm> using namespace std;class Solution { public:vector<int> parent;vector<int> count;int find(int x){if(x==parent[x]){return x;}return find(parent[x]);}//把i的老大換成j的老大void merge(int i, int j){parent[find(i)]=find(j);}void get_count(int n){for (int i=0;i<n;i++){ count[find(i)]+=1;}}int minSwapsCouples(vector<int>& row) {int n = row.size()/2;cout<<n<<endl;int res=0;for(int i=0;i<n;i++){parent.push_back(i);count.push_back(0);}for(int i=0;i<row.size();i+=2){merge(row[i]/2,row[i+1]/2);}get_count(n);// // //debug // for (int i=0;i<parent.size();i++)// {// cout<<"===parent[i]"<<parent[i]<<endl;// }//debug // for (int i=0;i<count.size();i++)// {// cout<<"===count[i]"<<count[i]<<endl;// }for (int i=0;i<count.size();i++){res+=max(count[i]-1,0);}return res;} }; int main() {Solution *p = new Solution();vector<int> row;row = {0, 2, 1, 3};int res = p->minSwapsCouples(row);cout<<"==res:"<<res<<endl;delete p;p=NULL;return 0; }

273.最大連續1的個數

思路1:直接數1個數

class Solution:def findMaxConsecutiveOnes(self, nums):count_one = 0res = 0for i in range(len(nums)):if nums[i]==1:count_one+=1else:count_one=0res = max(res, count_one)# print(res)return res

思路2:dp

class Solution:def findMaxConsecutiveOnes(self, nums):res = [-1]for i in range(len(nums)):if nums[i]==0:res.append(i)res.append(len(nums))print(res)if len(res)==1:return res[-1]max_length = 0for i in range(1, len(res)):max_length = max(res[i]-res[i-1]-1, max_length)print(max_length)return max_length

思路3:雙指針滑動窗口

class Solution:def findMaxConsecutiveOnes(self, nums):left,right=0,0res = 0while right<len(nums):if nums[right]==1:right+=1else:right+=1left=rightprint('==left,right:', left, right)res = max(res, right - left)print('==res:', res)return res

c++雙指針:

#include <vector> #include <iostream> #include <string> #include <algorithm> using namespace std;class Solution { public:int findMaxConsecutiveOnes(vector<int>& nums) {int left=0;int right = 0;int res = 0;while (right<nums.size()){if(nums[right]==1){right++;}else{ right++;left=right; }res = max(right-left, res);}return res; } };int main() {Solution *p = new Solution();vector<int> nums;nums = {1,1,0,1,1,1};int res = p->findMaxConsecutiveOnes(nums);cout<<"==res:"<<res<<endl;delete p;p=NULL;return 0; }

274.重塑矩陣

思路:對于h*w的元素個數,索引為h_index = i//rows,w_index = i%rows

python代碼

class Solution:def matrixReshape(self, nums: List[List[int]], r: int, c: int) -> List[List[int]]:h = len(nums)w = len(nums[0])if h*w != r*c:return numsres = [[0 for _ in range(c)] for _ in range(r)]# print(res)for i in range(h*w):res[i//c][i%c] = nums[i//w][i%w]# print(res)return res

c++代碼:

class Solution { public:vector<vector<int>> matrixReshape(vector<vector<int>>& nums, int r, int c) {int h = nums.size();int w = nums[0].size();// cout<<"==h:"<<h<<endl;vector<vector<int>> res(r ,vector<int>(c,0)); //初始化c*r元素為0的矩陣 // cout<<"==res.size():"<<res.size()<<endl;// cout<<"==res[0].size():"<<res[0].size()<<endl;if(h*w!=r*c){return nums;}for (int i=0;i<h*w;i++){ // cout<<"i/w:"<<i/w<<endl;// cout<<"i%w:"<<i%w<<endl;res[i/c][i%c] = nums[i/w][i%w];}return res;} };

275.最大連續1的個數 III

思路:其實就是滑動窗口判斷有大于K個0的則左指針右移動,之所以用大于K來判斷是因為0后續可能會跟著很多1,所以大于K的話,會把這些包含進去,和https://leetcode-cn.com/problems/longest-substring-without-repeating-characters/?思想一樣

python:

class Solution:def longestOnes(self, A: List[int], K: int) -> int:left,right =0,0n = len(A)zero_count =0res = 0while right<n:if A[right]==0:zero_count+=1#left向右收縮while zero_count>K:#大于K個0的時候就說明找到符合條件的了if A[left]==0:zero_count-=1left+=1res = max(res, right - left + 1)# print('=left:', left)# print('==right:', right)# print('==res:', res)right+=1# print(res)return res

c++

class Solution { public:int longestOnes(vector<int>& A, int K) {int left=0;int right =0;int res=0;int zero_count =0;int length = A.size();while(right<length){ if (A[right]==0){zero_count++;}while (zero_count>K){ if (A[left]==0){zero_count--;}left++;}res = max(res, right-left+1);right++;}return res;} };

276.數組的度

思路:三個hash,一個計度,一個記錄左索引,一個記錄右索引

python:

class Solution:def findShortestSubArray(self, nums: List[int]) -> int:dict_ = {}left_index_dict = {}right_index_dict = {}for i in range(len(nums)):dict_[nums[i]] = dict_.get(nums[i], 0)+1if nums[i] not in left_index_dict:left_index_dict[nums[i]] = iright_index_dict[nums[i]] = i# print('==dict_:', dict_)# print('=left_index_dict:', left_index_dict)# print('==right_index_dict:', right_index_dict)dict_ = dict(sorted(dict_.items(), key=lambda x:x[1],reverse=True))# print(dict_)max_degree = 0res = float('inf')for key,value in dict_.items():max_degree = valuebreak# print(max_degree)for key, value in dict_.items():if value==max_degree:res = min(res, right_index_dict[key] - left_index_dict[key]+1)# print('===res:',res)return res

c++:

class Solution { public:int findShortestSubArray(vector<int>& nums) {map<int, int>dict_;map<int, int>left_index_dict;map<int, int>right_index_dict;for(int i=0;i<nums.size();i++){dict_[nums[i]]++;if(left_index_dict.count(nums[i])==0){left_index_dict[nums[i]] = i;}right_index_dict[nums[i]] = i;}int max_degree=0;map<int,int>::iterator iter=dict_.begin();for (;iter!=dict_.end();iter++){max_degree = max(max_degree, iter->second);}int res=INT_MAX;map<int,int>::iterator iter_2=dict_.begin();for (;iter_2!=dict_.end();iter_2++){if (max_degree == iter_2->second){res = min(res, right_index_dict[iter_2->first] - left_index_dict[iter_2->first]+1);}}return res;} };

總結

以上是生活随笔為你收集整理的python刷题+leetcode(第三部分)的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。

一区中文字幕在线观看 | 青草视频网 | 69人人| 91麻豆视频 | 免费99视频 | 免费成人av在线看 | 成年人视频在线免费播放 | 激情黄色av | av不卡在线看 | av一级片在线观看 | 日韩国产欧美在线视频 | 久草在线综合网 | 日韩av网页 | 天天草天天干天天射 | 日本丶国产丶欧美色综合 | 精品久久久久久久久久久久久久久久 | 最近中文字幕免费av | 亚洲国产av精品毛片鲁大师 | 黄色一级大片在线免费看国产一 | 综合久久久久久久久 | 中文字幕免费看 | 亚洲精品在线视频播放 | 国产字幕在线播放 | 在线观看视频你懂 | 激情综合网天天干 | 欧美极度另类性三渗透 | 精品一区二区免费在线观看 | 一级黄网 | 综合激情 | 亚洲综合网 | 天天操天天射天天爽 | 欧美日韩精品二区第二页 | 91福利国产在线观看 | 一级特黄aaa大片在线观看 | 国产高清视频免费最新在线 | 天天草av | 国产午夜小视频 | www.狠狠操.com| 中文字幕有码在线观看 | 欧美亚洲久久 | 国产精品久久久久国产a级 激情综合中文娱乐网 | h视频在线看 | 亚洲五月六月 | 一区二区理论片 | 久久久av免费 | 欧美大荫蒂xxx| 婷婷开心久久网 | 久久久91精品国产一区二区精品 | 狠狠躁夜夜躁人人爽超碰97香蕉 | 91在线你懂的 | 免费一级片观看 | 精品免费99久久 | 国产美女网站视频 | 安徽妇搡bbbb搡bbbb | 有没有在线观看av | 日韩一级电影在线观看 | 超碰人人超 | 91精品91 | 午夜视频免费在线观看 | 国产精品一区二区在线观看 | 国产成人精品一区二区三区免费 | 91高清视频免费 | 国产一区二区在线播放 | 亚洲丁香日韩 | 999久久久久久久久久久 | 久久久久久国产精品久久 | 国产亚洲综合精品 | 欧美黄网站 | 国产高清黄色 | 成人网色 | 超碰日韩 | 亚洲天天看 | 狠狠操综合网 | 波多野结衣电影一区二区 | 成年人视频在线观看免费 | 久久久久久久国产精品视频 | 在线只有精品 | 日韩免费网站 | 播五月综合 | 九九热中文字幕 | 国产资源中文字幕 | 成 人 a v天堂| 亚洲精品高清视频 | 久久久精品国产一区二区三区 | x99av成人免费 | 激情综合网色播五月 | 天堂网一区 | 欧美天天综合网 | 成年人视频在线免费 | 婷婷色 亚洲 | 中文字幕一区二区在线观看 | 97偷拍在线视频 | 成人中文字幕在线 | www黄色 | 国色综合| 国产精品 999| 国产精品女视频 | 精品久久一区 | 精品国产福利在线 | 成人福利在线 | 色婷婷一 | 久久免费久久 | 91看片成人| 国产精品五月天 | 精品中文字幕在线观看 | 国产丝袜 | 天堂在线成人 | 色婷婷天天干 | 国产精品精品国产色婷婷 | 久久久免费毛片 | 在线观看av国产 | 日韩亚洲欧美中文字幕 | 蜜桃视频在线观看一区 | 国产男女无遮挡猛进猛出在线观看 | 成年人免费电影 | 国产精品免费大片视频 | 精品欧美日韩 | 国产免费一区二区三区最新6 | 天天综合网入口 | 国产字幕在线播放 | 中文字幕影视 | 五月天丁香综合 | 欧美一级视频免费看 | 91亚洲精品乱码久久久久久蜜桃 | 97色综合| 欧洲一区二区在线观看 | 在线免费观看黄色 | 天天操天天干天天操天天干 | 日韩电影在线观看一区 | 日韩视频一区二区三区在线播放免费观看 | 国内一级片在线观看 | 成人在线视频免费观看 | 日本h视频在线观看 | 人人干干人人 | a天堂免费 | 欧美激情综合五月色丁香小说 | 亚洲黄色片一级 | 日日爽夜夜爽 | 91视频下载 | 91九色在线观看视频 | 久久色网站| 日韩欧美在线观看一区二区三区 | 91精品国产91p65 | 毛片久久久 | 中文字幕免费国产精品 | 96精品在线 | 天天色天天射天天综合网 | 在线观看黄色的网站 | av电影在线免费观看 | 久久久久久久久久久影院 | a v在线观看 | 日韩精品一区二区三区丰满 | 婷婷 综合 色 | 蜜臀av麻豆| 国产黄色精品视频 | 久久午夜网 | 亚洲一区精品人人爽人人躁 | 99久高清在线观看视频99精品热在线观看视频 | 国产喷水在线 | av成人免费在线 | 国产 在线 高清 精品 | www.久久视频 | 91精品久| 亚洲精品视频在线看 | 中文字幕中文字幕在线中文字幕三区 | 不卡的av电影 | 日韩在线免费不卡 | 久久视了 | 国产亚洲精品日韩在线tv黄 | 日韩二区三区在线观看 | 精品视频在线播放 | 三级av网 | 天天干天天射天天插 | 最新日韩视频在线观看 | 91免费看黄色 | 欧美在线观看视频 | 成人毛片在线观看视频 | 黄a在线观看 | 久久精品一二区 | 久久久久久久亚洲精品 | 91chinese在线 | 日日爱av | 久久久久亚洲精品中文字幕 | 国产日韩欧美自拍 | 精品久久国产一区 | 日韩影视在线 | 天天色天天综合网 | 国产精品久久久久久久久免费看 | 久久免费视频2 | 久久综合狠狠狠色97 | 日韩免费高清在线观看 | 免费观看的黄色片 | 九色91福利| 中文字幕av全部资源www中文字幕在线观看 | 精品一区二区在线看 | 国产91在线观看 | 手机看片99| 国产成人精品亚洲a | 天天综合网~永久入口 | 日韩精品久久一区二区三区 | 操天天操| 99国产精品免费网站 | 午夜在线观看一区 | 色中射 | 最近免费在线观看 | 91综合在线| 麻豆久久久久 | www.狠狠干| 国产一卡久久电影永久 | 午夜久久美女 | 国产尤物视频在线 | 国产精品久久久久久久久久久杏吧 | 成人小电影在线看 | 91丨九色丨丝袜 | 亚洲夜夜综合 | 国产成视频在线观看 | 亚洲精品国偷拍自产在线观看 | 九九视频免费在线观看 | 欧美日韩中文另类 | 日韩专区在线播放 | 日韩高清精品免费观看 | 麻豆国产精品视频 | 欧美成人在线网站 | 欧美日韩国产二区 | 久久草网站 | 亚洲精品在线国产 | 黄色av观看| 国产r级在线观看 | 99欧美视频 | 五月天六月婷 | 国产精品理论片在线观看 | 婷婷五综合 | 久久精品永久免费 | 国产又粗又猛又色又黄视频 | 亚洲精品久久久久中文字幕二区 | 国产精品入口66mio女同 | 国产精品淫 | 精品视频www | 国产91影视| 中文字幕黄色 | 日本午夜在线观看 | 人人看黄色 | 日韩精品中文字幕在线观看 | 日本韩国精品在线 | 黄色国产精品 | 久久99精品久久久久久三级 | 深夜免费网站 | 国产日韩欧美在线观看 | 国产九色在线播放九色 | 精品一区二区在线免费观看 | 日本mv大片欧洲mv大片 | 在线观看岛国av | 四虎影院在线观看av | 97国产大学生情侣酒店的特点 | 国产精品久久久久久一区二区 | 亚洲五月综合 | 一区二区三区在线电影 | av在线永久免费观看 | 91精品国产91 | 欧美一级视频免费 | 久草免费在线观看视频 | 91视频免费观看 | 亚洲va欧美va人人爽春色影视 | 91精品在线免费视频 | 久久久免费看片 | 欧美久久九九 | 国产精品精品久久久 | 视频一区在线播放 | 91欧美精品 | 国产91精品欧美 | 欧美一级日韩免费不卡 | 亚洲精品国偷拍自产在线观看蜜桃 | 韩日av一区二区 | 国产精品毛片一区二区在线 | 在线视频 国产 日韩 | 亚洲欧洲av| 五月婷婷综合在线观看 | 在线免费观看国产精品 | 精品综合久久 | 91插插插网站 | 国产一二三区av | 性色av免费在线观看 | 特级西西444www大胆高清无视频 | 国产精品久久9 | 中文在线8新资源库 | 日日草视频 | 精品视频区 | 色婷婷亚洲 | 亚洲欧美日本一区二区三区 | www.久久精品视频 | 婷婷久久一区 | 国产国语在线 | 日韩欧美亚洲 | 欧美日韩国产在线 | 国产色网站 | 中文字幕有码在线播放 | 探花视频在线观看+在线播放 | 亚洲成人午夜av | 国产一二三四在线观看视频 | 日韩精品一区二区三区免费观看视频 | 久久视屏网 | 热久精品 | 久久精品毛片 | 久久久91精品国产 | 久久成人国产精品免费软件 | 日韩系列 | 天天操狠狠操 | 在线国产激情视频 | 国产特级毛片aaaaaaa高清 | 国产精品11| 国产一区二区视频在线播放 | 九热在线 | 手机在线看片日韩 | 欧美成人黄 | 激情小说网站亚洲综合网 | 超碰人人干人人 | 一区二区三区在线免费 | 日日夜夜天天 | 人人爱在线视频 | 一区二区精品在线视频 | 欧美日韩久久 | 182午夜在线观看 | av片在线观看免费 | 婷婷国产精品 | 国产精品精品久久久久久 | 国产一区视频免费在线观看 | 国产成人91 | 久久激情综合 | 亚洲人成人天堂h久久 | 久久久免费电影 | 久久精品网址 | 免费人做人爱www的视 | 国产福利精品在线观看 | av午夜电影 | 国产精品永久在线 | 一区二区三区日韩视频在线观看 | 91理论电影 | 超薄丝袜一二三区 | 亚洲精品国产视频 | 美女免费av| 国产中文欧美日韩在线 | 欧美人zozo | 国产精品福利小视频 | 免费观看黄 | 亚洲免费av一区二区 | 探花视频在线观看免费 | 久久一级片 | 99精品视频播放 | 日韩欧美在线一区 | 久久久麻豆视频 | 正在播放国产一区 | 在线看v片成人 | 免费成人在线观看 | 成人午夜电影在线 | 国内久久久久久 | 91九色老 | 日韩精品在线一区 | 久久香蕉影视 | 黄色网址在线播放 | 日韩视频在线观看免费 | 国产一区观看 | av在线免费网| 天天色综合1 | 91欧美日韩国产 | 午夜电影一区 | 国产一区二区电影在线观看 | 久久亚洲私人国产精品 | 欧美精品乱码99久久影院 | 日韩电影在线观看中文字幕 | 2023亚洲精品国偷拍自产在线 | 黄色com| 亚洲精品国产欧美在线观看 | 日韩特级黄色片 | 日日夜夜精品 | 国产涩涩在线观看 | 黄色免费av| 免费a级观看| 久久国产视屏 | 一级欧美日韩 | 麻豆视频免费看 | 西西大胆啪啪 | 91麻豆精品国产 | 91精品一 | 精品久久久久一区二区国产 | 97视频在线观看成人 | 波多野结衣在线观看一区二区三区 | 亚洲视频 在线观看 | 开心激情五月婷婷 | 美女视频永久黄网站免费观看国产 | 91精品久久久久久久久 | 91亚洲国产| 成人在线黄色 | 欧美在线99 | 久久综合99 | 亚洲欧美日韩一区二区三区在线观看 | 在线观看91精品视频 | 中文字幕色综合网 | 蜜臀av性久久久久av蜜臀三区 | 色婷婷天天干 | 精品一二三区视频 | 视频在线日韩 | 久久综合偷偷噜噜噜色 | 8x成人免费视频 | 99精品免费在线观看 | 国产精品久久在线 | 久久久久久久久久免费视频 | 国产午夜av| 999ZYZ玖玖资源站永久 | 夜夜骑日日操 | 国产一级免费观看视频 | 伊人日日干 | 色狠狠综合天天综合综合 | 日韩在线一二三区 | 精品一区二区在线播放 | 中文字幕久久精品 | 久久99国产精品视频 | 亚洲理论电影网 | 久久精品香蕉 | 日韩国产精品毛片 | 午夜精品福利在线 | 超碰97在线看 | 日韩精品一区二区免费视频 | 日本精品一区二区三区在线播放视频 | 黄色视屏av | 日韩av一区二区在线影视 | 五月婷婷中文字幕 | av网站免费在线 | 日韩 精品 一区 国产 麻豆 | 亚洲一区不卡视频 | 久久久久观看 | 国产亚洲婷婷免费 | 中文字幕久久网 | 中文字幕一区2区3区 | 国产精品国产三级国产不产一地 | 久久久久久毛片 | 亚洲综合在线观看视频 | 国产在线精品区 | 国产精品黄 | 精品极品在线 | 久久夜色精品亚洲噜噜国4 午夜视频在线观看欧美 | 久久久久久久电影 | 中文一区在线 | 国内精品久久久久 | 91中文在线观看 | 成人av在线影院 | 成人在线网站观看 | 国产精品久久久久久久久久久久 | 国产成人在线网站 | 日本精品视频网站 | 五月婷婷丁香网 | 免费一级黄色 | 国色综合 | 天天草天天干天天射 | 国产亚洲婷婷免费 | 国产不卡在线播放 | 日日草av | 美女黄频视频大全 | 国产精品高潮呻吟久久久久 | 久久久久成人精品 | 国产成人久久77777精品 | av成人在线观看 | 五月婷婷开心中文字幕 | www.神马久久| 黄色软件在线看 | 久草在线免费在线观看 | 五月婷婷中文网 | 91桃色在线播放 | 91精品国产网站 | 免费黄色特级片 | 国产视频手机在线 | 日韩成人精品在线观看 | 日韩理论片在线观看 | 日p视频| 樱空桃av | 色九九在线 | 久久久久久久久久毛片 | 麻豆va一区二区三区久久浪 | 992tv人人网tv亚洲精品 | 成人一区二区三区在线 | 天天做天天看 | 美女免费网视频 | 一区二区三区四区影院 | 午夜av网站 | 少妇资源站 | 偷拍精偷拍精品欧洲亚洲网站 | 天堂av网站 | av一级在线观看 | 91日韩在线播放 | av中文在线观看 | 欧美夫妻生活视频 | 日韩av免费在线电影 | 免费成人av电影 | 99久久国产免费,99久久国产免费大片 | 久久另类小说 | 在线观看av小说 | 婷婷网址 | 成人动漫视频在线 | 久久99热精品这里久久精品 | 探花视频免费观看 | 亚洲国产中文字幕在线观看 | 一级电影免费在线观看 | 91亚洲永久精品 | 丰满少妇一级片 | 综合国产在线 | 天堂久久电影网 | 97在线观看免费观看高清 | 一级黄色av | 日本激情中文字幕 | 在线国产视频 | 五月开心婷婷 | 亚洲精品男人天堂 | 99热这里只有精品久久 | 亚洲成人精品久久 | 97精品在线 | 成人在线网站观看 | 国产一区二区视频在线播放 | 成人h动漫精品一区二 | 久久久国产精品人人片99精片欧美一 | 天天色天天射综合网 | 又黄又爽的视频在线观看网站 | 色视频 在线 | 欧美精品乱码久久久久 | 成 人 免费 黄 色 视频 | 97在线观视频免费观看 | 91视频啊啊啊 | 久草在线中文视频 | 777奇米四色 | 精品国产乱码久久久久久浪潮 | 国产一级91| 成人一级| 久久国产片 | 五月激情婷婷丁香 | 国产亚洲视频在线免费观看 | 精品国精品自拍自在线 | 99久久毛片 | 99色在线视频| 久久国产成人午夜av影院潦草 | 久久午夜国产 | 在线亚洲免费视频 | 久久久www成人免费精品 | 久久久久国产精品一区 | 91女子私密保健养生少妇 | av中文天堂 | 人人舔人人舔 | www.亚洲精品视频 | 日本精品二区 | 久久婷婷国产色一区二区三区 | 开心婷婷色 | 日韩视频中文字幕在线观看 | 国产一区网 | 亚洲天天在线 | 国产自产高清不卡 | 91禁在线看 | 欧美日韩中文字幕视频 | 日韩免费一级a毛片在线播放一级 | 在线观看岛国片 | 日韩专区一区二区 | 六月婷婷网 | 水蜜桃亚洲一二三四在线 | 人人爱在线视频 | 国产成人久久77777精品 | 国产中文字幕av | 在线免费观看视频一区二区三区 | 亚洲干视频在线观看 | 亚洲a成人v | 狠狠的操狠狠的干 | 久久精品久久久久电影 | 99精品免费久久久久久日本 | 婷婷视频在线观看 | 亚洲精品99久久久久中文字幕 | 玖草在线观看 | 免费黄色特级片 | 日韩精品在线观看视频 | www久久99 | 久久亚洲欧美日韩精品专区 | 国产麻豆精品95视频 | 手机成人免费视频 | 免费99视频 | 国产专区视频在线 | 日韩精品中文字幕在线 | 久久亚洲二区 | 亚洲综合网站在线观看 | 处女av在线 | 黄污视频网站 | 激情视频在线观看网址 | av大全在线免费观看 | 日韩美在线 | 精品在线观 | 国产一区在线视频观看 | 91丨九色丨丝袜 | 亚洲成av人片在线观看香蕉 | 日韩免费高清在线 | 97精品国自产拍在线观看 | 日韩在线视频免费看 | 九九热视频在线播放 | 日韩大片在线免费观看 | 国产在线黄色 | 久久桃花网 | 日韩xxxbbb| 青青河边草免费直播 | 成人免费观看网站 | 亚洲黄色网络 | 久艹在线播放 | 成人在线电影观看 | 欧美一区二区三区在线看 | 亚洲jizzjizz日本少妇 | 特级免费毛片 | 精品av在线播放 | 91黄色在线看 | 久久久久久久久毛片 | 在线91观看| 国产精品一区免费看8c0m | 有码中文字幕 | 国产亚洲午夜高清国产拍精品 | 久久国产精品99久久久久久进口 | 日韩av免费观看网站 | 国产又粗又猛又黄又爽视频 | 国产 精品 资源 | 国产在线色| 中文字幕成人av | 日韩欧美视频在线 | 天天躁天天躁天天躁婷 | 久久99视频免费观看 | 日韩电影在线观看一区二区 | 日韩二区在线 | 视频国产一区二区三区 | 日日夜夜精品网站 | 激情久久久久久久久久久久久久久久 | 久久综合久久综合久久 | 日韩国产高清在线 | 欧美a√大片 | 国产999精品 | 91在线观看视频 | 免费看av片网站 | 亚洲国产精品500在线观看 | 在线成人国产 | 777xxx欧美| 在线播放国产一区二区三区 | 狠狠狠色丁香婷婷综合久久88 | 色偷偷人人澡久久超碰69 | 日韩综合在线观看 | 91在线porny国产在线看 | 国产亚洲欧美精品久久久久久 | 国产一二区视频 | 日韩有码在线观看视频 | 五月婷婷丁香网 | 成人久久免费视频 | 日韩高清不卡一区二区三区 | 91精品在线视频观看 | 婷婷丁香久久五月婷婷 | 精品视频免费在线 | 亚洲国产999| 亚洲国产色一区 | 免费观看黄色12片一级视频 | 日本黄色大片儿 | 国产原创在线 | 精品久久久久免费极品大片 | 成人午夜精品福利免费 | 午夜免费在线观看 | 欧美精品做受xxx性少妇 | 免费三级大片 | 成人免费在线观看入口 | 天天干,天天操 | 欧美日韩裸体免费视频 | 亚洲欧美国产日韩在线观看 | 久久6精品 | 国产亚洲精品久久 | 亚洲精品久久久久中文字幕m男 | 香蕉成人在线视频 | 黄色国产高清 | 成人毛片a| 久久99在线 | 99re久久资源最新地址 | 在线观看中文字幕一区 | 五月激情丁香 | 超碰人在线 | 国产高清免费av | 日韩免费视频观看 | 九九免费在线看完整版 | 五月天六月色 | 国产精品久久久久久久免费 | 国产精品一区二区久久精品 | 国产一区二区三区免费在线观看 | 精品久久一区二区三区 | 97视频在线免费 | 99热精品在线 | 日韩欧美在线观看一区二区 | av在线精品| 在线之家免费在线观看电影 | 久久网站免费 | 久久成人欧美 | 看av免费 | 久久国产二区 | 1024在线看片| 人人干网站 | 中文在线字幕免费观 | 亚洲精品小视频 | 五月天久久久久 | 精品国产一区二区三区久久久蜜月 | 国产3p视频| 天天撸夜夜操 | 伊人国产视频 | 97综合在线| 在线观看中文字幕视频 | 久久在视频| 97免费在线观看视频 | 成人教育av | 久久高清国产视频 | 91精品国自产在线偷拍蜜桃 | 99久久夜色精品国产亚洲96 | 成年人免费在线 | 久久综合狠狠综合久久激情 | 国产免费观看视频 | 在线亚洲人成电影网站色www | 久久99精品国产麻豆宅宅 | 久草香蕉在线 | 91av视频观看 | 蜜臀av性久久久久蜜臀aⅴ涩爱 | 玖玖玖在线观看 | 色网址99 | 久久亚洲综合国产精品99麻豆的功能介绍 | 亚洲精品综合欧美二区变态 | 激情网五月 | 日本公妇在线观看高清 | www·22com天天操 | 国产玖玖视频 | 狠狠干网站| 91一区在线观看 | 天天色天天艹 | 亚洲精品福利在线 | 国产小视频在线免费观看 | 国内精品视频在线播放 | 久操视频在线观看 | 久久综合九色综合久久久精品综合 | 日本bbbb摸bbbb| 欧美激情精品一区 | 99re久久精品国产 | 免费在线看成人av | 337p日本欧洲亚洲大胆裸体艺术 | 欧美国产日韩久久 | 香蕉影院在线观看 | 性色视频在线 | 婷婷激情久久 | 久久99国产精品自在自在app | 精品国产伦一区二区三区观看说明 | 成人免费在线播放 | 久久久久久久久久免费 | 有码中文在线 | 国产精品18久久久久久久久久久久 | 国产成人一区二区三区在线观看 | 免费观看成人av | 五月婷婷综合激情网 | 免费看成人a | 欧美极品少妇xxxxⅹ欧美极品少妇xxxx亚洲精品 | 久久视频免费在线观看 | 国产高清无线码2021 | 少妇bbb搡bbbb搡bbbb | 日日天天| 国产区高清在线 | 久久综合偷偷噜噜噜色 | 97超级碰碰碰视频在线观看 | 免费aa大片 | 精品久久久久久久久亚洲 | 精品麻豆入口免费 | 在线观看亚洲精品 | 中文字幕九九 | 色姑娘综合网 | 91豆麻精品91久久久久久 | 人人爽人人爽av | 在线观看网站黄 | 中文字幕在线网址 | 91丨九色丨首页 | 午夜色婷婷 | 日韩免费一区二区在线观看 | 国产精品久久久久久久久久免费 | 国产精品美女999 | 成人禁用看黄a在线 | 国产精品18久久久久vr手机版特色 | 最新国产精品拍自在线播放 | 欧美在线视频日韩 | 久久国产成人午夜av影院宅 | 97视频精品| 久草资源在线观看 | 国产一区二区日本 | 久久久综合香蕉尹人综合网 | 黄色在线观看免费网站 | 久久激情小视频 | 久久精品高清 | 综合激情网 | 天天射射天天 | 最近日本mv字幕免费观看 | 蜜臀av性久久久久av蜜臀三区 | 中文字幕高清 | av免费看看| 91成人精品观看 | 久草视频国产 | 亚洲最新av | 久草在线费播放视频 | 欧美精品三级 | 午夜成人免费电影 | 夜又临在线观看 | 在线观看一区二区视频 | 国产精品日韩 | 国产人成看黄久久久久久久久 | 高清中文字幕 | 天堂网av 在线| 久保带人 | 国产精品久久一区二区无卡 | 精品爱爱 | 久草在线资源观看 | av一级久久 | 亚洲精品在线一区二区三区 | 欧美精品二 | 成人免费在线看片 | 国产露脸91国语对白 | 亚州国产精品久久久 | 黄网站色视频免费观看 | 国内一区二区视频 | 中文字幕在线观看视频一区 | 狠狠88综合久久久久综合网 | 日本精品久久 | 麻豆成人在线观看 | 中文 一区二区 | 国产一区高清在线观看 | 久久免费国产精品 | 国产亚洲永久域名 | 国产精品自产拍在线观看桃花 | 国产亚洲字幕 | 一区二区三区高清在线观看 | av色网站| 久草在线观看视频免费 | 日日操日日干 | 天天干天天搞天天射 | 久色 网| 中文字幕色在线视频 | 狠狠色免费 | 成人亚洲精品国产www | 国内精品久久久久久久影视麻豆 | 美女视频黄色免费 | 九九精品久久久 | 欧美日韩国产在线观看 | 在线播放日韩av | 狠狠狠狠干 | 免费在线观看av不卡 | 中文字幕在线中文 | 国产午夜小视频 | 午夜色大片在线观看 | 不卡av免费在线观看 | 国产一区二区成人 | 处女av在线| 亚洲 精品在线视频 | 天天插天天操天天干 | 96久久久 | 日韩动漫免费观看高清完整版在线观看 | 五月综合在线观看 | 97成人精品视频在线播放 | 91热| 奇米影视8888 | 国产在线视频一区二区三区 | 久久婷婷丁香 | 美女免费视频一区二区 | 黄色av播放 | 欧美在线视频第一页 | 少妇18xxxx性xxxx片| 欧美成人影音 | 国产黄色片免费看 | 丁香花在线观看视频在线 | 高清不卡一区二区在线 | 国产成人精品日本亚洲999 | 国产第一页福利影院 | 成人毛片100免费观看 | 中文字幕永久 | 91热在线 | 国产人成在线视频 | 狠狠色噜噜狠狠狠狠2022 | 永久免费看av| 国产精品一区二区精品视频免费看 | 激情视频在线观看网址 | 一级α片 | 国产成人综合精品 | 伊人伊成久久人综合网小说 | 国产亚洲精品久久久久久大师 | 日韩在线免费视频观看 | 久久精品视频一 | 91视频久久久久久 | 色婷婷电影 | 色偷偷888欧美精品久久久 | 一区二区视频播放 | 午夜精品久久久久久中宇69 | 999久久久国产精品 高清av免费观看 | 国产一区视频在线观看免费 | 国产精品高清在线 | 日韩美女一级片 | 日韩区欧美久久久无人区 | 免费高清看电视网站 | 久草在线中文888 | 欧美精品中文 | 国产一级二级三级视频 | 日韩天堂在线观看 | 国产精品久久久久久久久岛 | 国产特级毛片aaaaaa高清 | 2017狠狠干 | 青青草国产精品 | 色婷婷色 | 中文字幕日韩高清 | 亚洲精品在线网站 | 一区二区三区日韩在线观看 | 国产91学生粉嫩喷水 | 日韩免费在线一区 | 99国产精品久久久久久久久久 | 伊人热 | 日韩免费成人 | 亚洲欧洲一区二区在线观看 | 国产成人在线观看免费 | 日日精品 | 91久久国产露脸精品国产闺蜜 | avlulu久久精品 | 五月色丁香 | 91cn国产在线 | 亚洲a在线观看 | 亚洲一区二区三区四区精品 | 人人要人人澡人人爽人人dvd | 免费在线播放黄色 | 综合色亚洲 | 亚洲欧洲美洲av | 高清av在线 | 免费看十八岁美女 | 久久精品一级片 | 国产专区欧美专区 | 国产色综合天天综合网 | 成人av片免费看 | 欧美色图亚洲图片 | 奇米导航 | 91视频在线免费看 | 丁香婷婷综合激情五月色 | 国产色视频一区二区三区qq号 | 欧美另类视频 | 久久手机在线视频 | 天天鲁天天干天天射 | 免费国产黄线在线观看视频 | 日韩欧美高清一区二区 | 成人免费在线播放视频 | aaa亚洲精品一二三区 | 国产视频精选 | 欧美黑吊大战白妞欧美 | 亚洲国产精品久久久久久 | 99久久精品国产一区 | 中文字幕免费不卡视频 | 97成人在线| 欧美一级免费高清 | 亚洲精区二区三区四区麻豆 | 日韩精品网址 | 亚洲视频在线免费观看 | 久久无码av一区二区三区电影网 | 欧美激情精品久久久久 | 欧洲激情在线 | 亚洲国产精品一区二区尤物区 | 97天堂网| 色婷婷成人网 | 国产精品久久久久久久久久白浆 | 91精品一区二区三区久久久久久 | 久久精品影视 | 麻豆国产在线播放 | www.婷婷色| 国产亚洲在线观看 | 青青河边草免费视频 | 亚洲mv大片欧洲mv大片免费 | 激情偷乱人伦小说视频在线观看 | 2024国产精品视频 | 中文字幕在线观看你懂的 | 国产亚洲精品久久网站 | 国内外成人在线 | 婷婷射五月 | 日本巨乳在线 | bbw av| 亚洲精品视频免费在线观看 | 久久久久伦理电影 | 日韩免费一级电影 | 久久夜av | 成人久久久久久久久久 | 最新中文字幕在线观看视频 | 国产在线理论片 | 99视频久久 | 免费观看日韩 | 伊人网站| 日日日干| 激情五月六月婷婷 | 婷婷视频| 亚洲欧美在线观看视频 | 日韩精品首页 | 国产永久免费高清在线观看视频 | 天天操狠狠操夜夜操 | 黄色avwww| 久久精品久久精品久久精品 | av在线成人 | 一区二区三区在线观看中文字幕 | 麻豆91精品91久久久 | 色先锋av资源中文字幕 |