力扣刷題筆記:765.情侶牽手(暴力解法,速度超93.97%的提交,空間超62%的提交,大年初三的困難題,就這。。。)
題目:
765、情侶牽手
N 對情侶坐在連續排列的 2N 個座位上,想要牽到對方的手。 計算最少交換座位的次數,以便每對情侶可以並肩坐在一起。 一次交換可選擇任意兩人,讓他們站起來交換座位。
人和座位用 0 到 2N-1 的整數表示,情侶們按順序編號,第一對是 (0, 1),第二對是 (2, 3),以此類推,最後一對是 (2N-2, 2N-1)。
這些情侶的初始座位 row[i] 是由最初始坐在第 i 個座位上的人決定的。
示例 1:
輸入: row = [0, 2, 1, 3]
輸出: 1
解釋: 我們只需要交換row[1]和row[2]的位置即可。
示例 2:
輸入: row = [3, 2, 0, 1]
輸出: 0
解釋: 無需交換座位,所有的情侶都已經可以手牽手了。
說明:
len(row) 是偶數且數值在 [4, 60]範圍內。
可以保證row 是序列 0…len(row)-1 的一個全排列。
題解思路:
1、觀察題目所給的列表,針對元素a,若是奇數對應的情侶必為a+1,若是偶數對應的情侶必為a-1 。
2、直接對列表進行遍歷(遍歷步長為2),判斷元素row[i]的情侶是否為row[i+1],不是則在剩餘的列表元素中查詢,找到後交換row[i+1]與row[j](目標情侶)。
注:遍歷步長設為2,是因為在交換後 i+1 位置必定滿足情侶相鄰條件,不需要再次遍歷判斷。
題解python程式碼:
class Solution:
def minSwapsCouples(self, row: List[int]) -> int:
# 定義函式獲取一個數的另一半
def getPerson(p):
return p+1 if p%2==0 else p-1
count,n = 0,len(row)
for i in range(0, n-1, 2):
t = getPerson(row[i])
if t!=row[i+1]: # 如果row[i+1]的值不是row[i]的情侶,則對剩下的人進行查詢
for j in range(i+1, n):
if row[j]==t: # 找到後二者交換
row[i+1],row[j] = row[j],row[i+1]
count += 1
# print(row)
return count
作者:a-qing-ge
連結:https://leetcode-cn.com/problems/couples-holding-hands/solution/bao-li-jie-fa-su-du-chao-9397de-ti-jiao-0j8cf/
來源:力扣(LeetCode)https://leetcode-cn.com/problems/couples-holding-hands/