欢迎访问 生活随笔!

生活随笔

当前位置: 首页 > 编程资源 > 编程问答 >内容正文

编程问答

LeetCode 情侣牵手 (贪心)

发布时间:2024/9/30 编程问答 44 豆豆
生活随笔 收集整理的这篇文章主要介绍了 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)

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

在这里插入图片描述

总结

以上是生活随笔为你收集整理的LeetCode 情侣牵手 (贪心)的全部内容,希望文章能够帮你解决所遇到的问题。

如果觉得生活随笔网站内容还不错,欢迎将生活随笔推荐给好友。