1. 程式人生 > 其它 >力扣刷題筆記:765.情侶牽手(暴力解法,速度超93.97%的提交,空間超62%的提交,大年初三的困難題,就這。。。)

力扣刷題筆記:765.情侶牽手(暴力解法,速度超93.97%的提交,空間超62%的提交,大年初三的困難題,就這。。。)

技術標籤:刷題筆記leetcodepython

題目:

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/