【Leetcode】3011-1497

前言

题目的rating不算很高,因此整体的过程也不会很复杂,乍一看直接排序?但是实际上这个问题还是有一些坑的


思路

首先可以看到的是由于只是数字对应二进制中1个数相同的相邻数字才可以交换顺序,因此如果某一段的二进制1个数a相同,而相邻有一段数字对应二进制1个数均为b。那么此时实际上两段数字经过操作之后是不可能出现交叉的。

也就是说问题拆分为若干段连续的子数组,每个子数组可以自由排序,问最终得到的整体数组是否是有序的。
有了这个思路就写出来乐以下的吊毛代码

class Solution:
    def canSortArray(self, nums: List[int]) -> bool:
        c1 = [int.bit_count(x) for x in nums]
        c2 = [int.bit_count(x) for x in sorted(nums)]
        return c1==c2

提交测试,发现是错误的,问题出现在哪里?
答:前序的结论是不同子数组之间不能交换,即便是二进制数字相同的不相邻子数组可以不可以交换的,因此这个代码就是犯这个错误了。

正确的代码如下所示:

class Solution:
    def canSortArray(self, nums: List[int]) -> bool:
        l = 0
        for i,x in enumerate(nums):
            if int.bit_count(x)!=int.bit_count(nums[l]):
                nums[l:i]=sorted(nums[l:i])
                l = i
        nums[l:]=sorted(nums[l:])
        return nums==sorted(nums)

代码的思路就是将每个子数组进行排序之后判断其与整体排序是否相同

当然其实我们也可以发现,实际上每个子数组是不需要进行排序的,只需要判断其最小值与上一段的最大值是否符合要求,即可。

class Solution:
    def canSortArray(self, nums: List[int]) -> bool:
        l = 0
        curMax = -1
        for i,x in enumerate(nums):
            if int.bit_count(x)!=int.bit_count(nums[l]):
                if min(nums[l:i])<curMax:return False
                curMax = max(nums[l:i]) # 当前段的最大值
                l = i
        return min(nums[l:])>=curMax
posted @ 2024-07-13 14:43  TICSMC  阅读(5)  评论(0)    收藏  举报