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+=1
        return res

c=Solution()
d=c.minSwapsCouples([0,2,1,3])
print(d)

结果:1

代码2

class Solution:
    def minSwapsCouples(self, row: List[int]) -> int:
        res = 0
        for i in range(0,len(row),2):#从左到右遍历奇数位置的人
            x = row[i]^1 #找人到row[i]的伴侣值
            if x == row[i+1]:#如果row[i]后一个为伴侣,不计数,退出本次循环
                continue
            res += 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]
                    break
        return 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)

print("19^1的结果是",19^1)
print("18^1的结果是",18^1)

在这里插入图片描述
在这里插入图片描述

猜你喜欢

转载自blog.csdn.net/kobeyu652453/article/details/106874638
今日推荐