本篇內(nèi)容主要講解“Python多維列表中的坑怎么解決”,感興趣的朋友不妨來看看。本文介紹的方法操作簡(jiǎn)單快捷,實(shí)用性強(qiáng)。下面就讓小編來帶大家學(xué)習(xí)“Python多維列表中的坑怎么解決”吧!
成都創(chuàng)新互聯(lián)公司是一家集成都網(wǎng)站制作、網(wǎng)站建設(shè)、網(wǎng)站頁面設(shè)計(jì)、網(wǎng)站優(yōu)化SEO優(yōu)化為一體的專業(yè)網(wǎng)站建設(shè)公司,已為成都等多地近百家企業(yè)提供網(wǎng)站建設(shè)服務(wù)。追求良好的瀏覽體驗(yàn),以探求精品塑造與理念升華,設(shè)計(jì)最適合用戶的網(wǎng)站頁面。 合作只是第一步,服務(wù)才是根本,我們始終堅(jiān)持講誠(chéng)信,負(fù)責(zé)任的原則,為您進(jìn)行細(xì)心、貼心、認(rèn)真的服務(wù),與眾多客戶在蓬勃發(fā)展的市場(chǎng)環(huán)境中,互促共生。
(以下默認(rèn)nums
為數(shù)組。)
1.遍歷數(shù)組
遍歷:
for num in nums: xxxx
帶索引遍歷
for idx,num in enumerate(nums): xxxx
2.動(dòng)態(tài)規(guī)劃(dp)
動(dòng)態(tài)規(guī)劃一般可以用一個(gè)數(shù)組保存狀態(tài)。見53.最大子數(shù)組和
。
用數(shù)組保存狀態(tài)是非常常用的做法。例如36.有效的數(shù)獨(dú)
、 73. 矩陣置零
。
3.雙指針
見88.合并兩個(gè)有序數(shù)組
、350.兩個(gè)數(shù)組的交集 II
可以是左右指針對(duì)一個(gè)數(shù)組使用。
也可以是兩個(gè)指針遍歷兩個(gè)數(shù)組。while index1
Python中一般用list
實(shí)現(xiàn)可變數(shù)組。
下面是list
常用的函數(shù)。
(可變序列類型通用操作,只有.sort
是list
獨(dú)有的。參考序列操作文檔)
函數(shù) | 功能 |
---|---|
nums.sort(key,reversed) | (原地)按照key升序排序,reversed可以指定是否反轉(zhuǎn)。 |
sorted(nums,key,reversed) | 用法與nums.sort 類似,但返回另一個(gè)數(shù)組,原數(shù)組不變。 |
s.append(x) | 將 x 添加到序列的末尾 |
s.extend(t) 或 s += t | 用 t 的內(nèi)容擴(kuò)展 s |
x in s | 判斷x是否在數(shù)組nums 中。 |
len(s) | 返回s 長(zhǎng)度 |
max(s)、min(s) | 返回s 最大值、最小值 |
all(iterable) | 如果 iterable 的所有元素均為真值(或可迭代對(duì)象為空)則返回 True |
any(iterable) | 如果 iterable 的任一元素為真值則返回 True 。 如果可迭代對(duì)象為空,返回 False 。 |
創(chuàng)建多維列表,一般用
w, h = 2, 3 A = [[None] * w for i in range(h)]
等價(jià)于
A = [None] * 3 for i in range(3): A[i] = [None] * 2
而不是
A = [[None] * 2] * 3
原因在于用*
對(duì)列表執(zhí)行重復(fù)操作并不會(huì)創(chuàng)建副本,而只是創(chuàng)建現(xiàn)有對(duì)象的引用。 *3
創(chuàng)建的是包含 3 個(gè)引用的列表,每個(gè)引用指向的是同一個(gè)長(zhǎng)度為 2 的列表。
如果你給一項(xiàng)賦值,就會(huì)發(fā)現(xiàn)這個(gè)問題:
>>> A[0][0] = 5 >>> A [[5, None], [5, None], [5, None]]
給定數(shù)組,判斷是否存在重復(fù)元素。 做法:
直接遍歷(窮舉)
排序后,比較每個(gè)元素和下一個(gè)元素
哈希表
直接遍歷會(huì)超時(shí)。 2的時(shí)間復(fù)雜度是O(nlogn) 也就是排序的時(shí)間復(fù)雜度 3的時(shí)間復(fù)雜度是O(n),但需要額外的O(n)輔助空間。 (窮舉法基本都能想到,但很容易超時(shí),后面只有在窮舉法能通過時(shí)才列出來。)
3比較簡(jiǎn)單,這里寫一下3的做法:
return len(nums) != len(set(nums))
給定數(shù)組,求其中一個(gè)連續(xù)數(shù)組和的最大值。
比較容易想到的是用一個(gè)數(shù)組記錄目前位置最大的值(動(dòng)態(tài)規(guī)劃)。
用 dp[i]
表示以i
位置結(jié)尾的連續(xù)數(shù)組和的最大值。
最后返回dp數(shù)組中最大值。
class Solution: def maxSubArray(self, nums: List[int]) -> int: length = len(nums) dp = [0 for i in range(length)] for i in range(length): dp[i] = max(dp[i - 1], 0) + nums[i] return max(dp)
題解給出了一種省略dp數(shù)組的方法:
class Solution: def maxSubArray(self, nums: List[int]) -> int: pre = 0 res = nums[0] for x in nums: pre = max(pre+x ,x) res = max(res, pre) return res
找出數(shù)組中兩個(gè)數(shù)之和等于target
的兩數(shù)下標(biāo)。
但時(shí)間較長(zhǎng),時(shí)間復(fù)雜度$O(N^2)$
class Solution: def twoSum(self, nums: List[int], target: int) -> List[int]: n = len(nums) for i in range(n): for j in range(i + 1, n): if nums[i] + nums[j] == target: return [i, j] return []
官方題解的一個(gè)比較巧妙的方式:使用哈希表(字典) 用字典記錄出現(xiàn)過的數(shù)字的位置。 時(shí)間復(fù)雜度$O(N)$,空間復(fù)雜度$O(N)$
class Solution: def twoSum(self, nums: List[int], target: int) -> List[int]: hashtable = dict() for i, num in enumerate(nums): if target - num in hashtable: return [hashtable[target - num], i] hashtable[nums[i]] = i return []
兩個(gè)有序數(shù)組,將第二個(gè)數(shù)組nums2
合并到第一個(gè)數(shù)組nums1
。
1.可以用雙指針遍歷兩個(gè)數(shù)組:
class Solution: def merge(self, nums1: List[int], m: int, nums2: List[int], n: int) -> None: """ Do not return anything, modify nums1 in-place instead. """ # 兩個(gè)中存在空數(shù)組的時(shí),直接返回 if m == 0: nums1[:] = nums2[:] return if n == 0: return index1,index2 = 0,0 t = [] while index1官方版本,更簡(jiǎn)潔、清楚。
class Solution: def merge(self, nums1: List[int], m: int, nums2: List[int], n: int) -> None: """ Do not return anything, modify nums1 in-place instead. """ sorted = [] p1, p2 = 0, 0 while p1 < m or p2 < n: if p1 == m: sorted.append(nums2[p2]) p2 += 1 elif p2 == n: sorted.append(nums1[p1]) p1 += 1 elif nums1[p1] < nums2[p2]: sorted.append(nums1[p1]) p1 += 1 else: sorted.append(nums2[p2]) p2 += 1 nums1[:] = sorted(暴力) 追加后排序
更簡(jiǎn)單粗暴的方式是直接將
nums2
追加到nums1
后,進(jìn)行排序。 及其簡(jiǎn)單而且效果很好。class Solution: def merge(self, nums1: List[int], m: int, nums2: List[int], n: int) -> None: """ Do not return anything, modify nums1 in-place instead. """ nums1[m:] = nums2 nums1.sort()第3天
350. 兩個(gè)數(shù)組的交集 II
以數(shù)組形式返回兩數(shù)組的交集(數(shù)組形式,返回結(jié)果中每個(gè)元素出現(xiàn)的次數(shù),應(yīng)與元素在兩個(gè)數(shù)組中都出現(xiàn)的次數(shù)一致)。 排序后雙指針遍歷。
class Solution: def intersect(self, nums1: List[int], nums2: List[int]) -> List[int]: nums1.sort() nums2.sort() i = 0 j = 0 result = [] while inums2[j]): j+=1 else: result.append(nums1[i]) i+=1 j+=1 return result 121. 買賣股票的最佳時(shí)機(jī)
只需要記錄下當(dāng)前最低價(jià),遍歷價(jià)格過程中,用當(dāng)前價(jià)格-最低價(jià) 就是當(dāng)前可獲得的最大利潤(rùn)。另外如果出現(xiàn)了更低的價(jià)格,則最低價(jià)也要更新。(一個(gè)樸素的想法,要是我在最低點(diǎn)買進(jìn)就好了) 總的最大利潤(rùn)就是這些利潤(rùn)中的最大值。
class Solution: def maxProfit(self, prices: List[int]) -> int: r = 0 min_price = float('inf') # float('inf')表示正無窮 for price in prices: min_price = min(min_price, price) # 截止到當(dāng)前的最低價(jià)(買入價(jià)) r = max(r, price - min_price) # 截止到目前的最高利潤(rùn) return r第4天
566. 重塑矩陣
給定一個(gè)
mx
n的數(shù)組,重構(gòu)為rxc
的數(shù)組。 比較簡(jiǎn)單的想法是把數(shù)組拉平為一位數(shù)組,然后逐個(gè)填充到新的數(shù)組中:class Solution: def matrixReshape(self, mat: List[List[int]], r: int, c: int) -> List[List[int]]: m,n = len(mat), len(mat[0]) if m*n != r*c: return mat arr = [] for row in mat: for x in row: arr.append(x) arr_index = 0 newmat = [[0 for j in range(c)]for i in range(r)] for i in range(r): for j in range(c): newmat[i][j] = arr[arr_index] arr_index += 1 return newmat官方提供了一種直接計(jì)算下標(biāo)的方法:
class Solution: def matrixReshape(self, nums: List[List[int]], r: int, c: int) -> List[List[int]]: m, n = len(nums), len(nums[0]) if m * n != r * c: return nums ans = [[0] * c for _ in range(r)] for x in range(m * n): ans[x // c][x % c] = nums[x // n][x % n] return ans118. 楊輝三角
找規(guī)律題??梢灾苯影凑丈傻囊?guī)律生成數(shù)組。
在「楊輝三角」中,每個(gè)數(shù)是它左上方和右上方的數(shù)的和。
class Solution: def generate(self, numRows: int) -> List[List[int]]: res = [[]for _ in range(numRows)] res[0] = [1] for i in range(1,numRows): res[i].append(1) for j in range(0,len(res[i-1])-1): res[i].append(res[i-1][j] + res[i-1][j+1]) res[i].append(1) return res第5天
36. 有效的數(shù)獨(dú)
判斷當(dāng)前數(shù)獨(dú)是否有效(不需要填充數(shù)獨(dú)) 只要用3個(gè)二維數(shù)組維護(hù)9行、9列、9個(gè)九宮格。
class Solution: def isValidSudoku(self, board: List[List[str]]) -> bool: row = [[] * 9 for _ in range(9)] col = [[] * 9 for _ in range(9)] nine = [[] * 9 for _ in range(9)] for i in range(len(board)): for j in range(len(board[0])): tmp = board[i][j] if not tmp.isdigit(): continue if (tmp in row[i]) or (tmp in col[j]) or (tmp in nine[(j // 3) * 3 + (i // 3)]): return False row[i].append(tmp) col[j].append(tmp) nine[(j // 3) * 3 + (i // 3)].append(tmp) return True73. 矩陣置零
如果一個(gè)元素為 0 ,則將其所在行和列的所有元素都設(shè)為 0 。請(qǐng)使用 原地 算法。 A: 利用數(shù)組的首行和首列來記錄 0 值 另外用兩個(gè)布爾值記錄首行首列是否需要置0
class Solution: def setZeroes(self, matrix: List[List[int]]) -> None: """ Do not return anything, modify matrix in-place instead. """ #標(biāo)記 m,n = len(matrix), len(matrix[0]) row = any(x == 0 for x in matrix[0]) col = any(matrix[r][0] == 0 for r in range(m) ) for i in range(m): for j in range(n): if matrix[i][j] == 0: matrix[i][0] = 0 matrix[0][j] = 0 #置零 for i in range(1,m): for j in range(1,n): if matrix[i][0] == 0 or matrix[0][j] == 0: matrix[i][j] = 0 if row: for j in range(0,n): matrix[0][j] = 0 if col: for i in range(0,m): matrix[i][0] = 0到此,相信大家對(duì)“Python多維列表中的坑怎么解決”有了更深的了解,不妨來實(shí)際操作一番吧!這里是創(chuàng)新互聯(lián)網(wǎng)站,更多相關(guān)內(nèi)容可以進(jìn)入相關(guān)頻道進(jìn)行查詢,關(guān)注我們,繼續(xù)學(xué)習(xí)!
文章標(biāo)題:Python多維列表中的坑怎么解決
瀏覽路徑:http://weahome.cn/article/goiigh.html