LeetCode 情侣牵手 (贪心)
描述
N對夫婦坐在2N個排成一排的座位上. 現求最小的交換數量,使每對夫婦并坐一起,他們可以手牽著手。
一次交換可選擇任何兩個人交換座位。
人和座位由從0到2N-1的整數表示,夫妻按順序編號,第一對是(0,1),第二對是(2,3),以此類推,最后一對是(2N-2,2N-1)。
初始座位由row [i]給出,表示坐在第i座位的人的編號。
1.len(row) 是偶數且范圍為 [4, 60].
2.row 一定是[0, 1…len(row)-1]的一個排列.
您在真實的面試中是否遇到過這個題?
樣例
樣例 1:
輸入: row = [0, 2, 1, 3]
輸出: 1
解釋: 只需交換row[1]的人和row[2]的人即可.
樣例 2:
輸入: row = [3, 2, 0, 1]
輸出: 0
解釋: 每一對夫婦已經并坐一起.
思路:
如給出一個正確輸入:row=[0,1,2,3]。 row = [3, 2, 0, 1]
步驟1:從左到右遍歷奇數位置的人,設定當前遍歷的數為row[i]
步驟2::如果row[i]為偶數,則row[i]的伴侶應該為row[i]+1,如row=[0,1,2,3]中0的伴侶是1;如果row[i]為奇數,則row[i]的伴侶為row[i]-1。如row=[0,1,2,3]中3的伴侶為2。
步驟3:返回row[i]伴侶的索引位置。list.index(a)會返回list中值為a的索引位置
步驟4:將找到的row[i]伴侶 和row[i+1] 交換下位置
步驟5:次數+1
代碼1
class Solution:def minSwapsCouples(self,row):# row :list[int]res=0 #記錄次數for i in range(0,len(row),2):#從左到右遍歷奇數位置的人tag=row[i]+1 if row[i]%2==0 else row[i]-1 #找到當前row[i]的伴侶 。找到伴侶值if row[i+1]!=tag:#如果row[i]的伴侶不是后一位,則尋找它的伴侶和row[i+1] 交換位置tagindex=row.index(tag)#row[i]的伴侶的位置索引row[i+1],row[tagindex]=row[tagindex],row[i+1]res+=1return resc=Solution() d=c.minSwapsCouples([0,2,1,3]) print(d)結果:1
代碼2:
class Solution:def minSwapsCouples(self, row: List[int]) -> int:res = 0for i in range(0,len(row),2):#從左到右遍歷奇數位置的人x = row[i]^1 #找人到row[i]的伴侶值if x == row[i+1]:#如果row[i]后一個為伴侶,不計數,退出本次循環continueres += 1#如果row[i]后一個不為伴侶,計數+1,并for 循環找到row[i]伴侶,和row[i+1]交換位置for j in range(i+1,len(row)):if row[j] == x:row[i+1],row[j] = row[j],row[i+1]breakreturn res說明:row[i]^1 異或1
row[i]為偶數時 row[i]^1 =row[i]+1
row[i]為奇數時 row[i]^1 =row[i]-1
記憶:偶數 為0 ,或為0,異或為1 (等于偶數(0)+1)
奇數 為1 ,或為1,異或為0 (等于奇數(1)-1)
在這里插入圖片描述
總結
以上是生活随笔為你收集整理的LeetCode 情侣牵手 (贪心)的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 秘书工作需要做大量的会议记录,想入手讯飞
- 下一篇: 美国,巴西,俄罗斯,印度哪个国家出口粮食