列表

详情


100199. 判断一个数组是否可以变为有序

给你一个下标从 0 开始且全是  整数的数组 nums 。

一次 操作 中,如果两个 相邻 元素在二进制下数位为 1 的数目 相同 ,那么你可以将这两个元素交换。你可以执行这个操作 任意次 (也可以 0 次)。

如果你可以使数组变有序,请你返回 true ,否则返回 false 。

 

示例 1:

输入:nums = [8,4,2,30,15]
输出:true
解释:我们先观察每个元素的二进制表示。 2 ,4 和 8 分别都只有一个数位为 1 ,分别为 "10" ,"100" 和 "1000" 。15 和 30 分别有 4 个数位为 1 :"1111" 和 "11110" 。
我们可以通过 4 个操作使数组有序:
- 交换 nums[0] 和 nums[1] 。8 和 4 分别只有 1 个数位为 1 。数组变为 [4,8,2,30,15] 。
- 交换 nums[1] 和 nums[2] 。8 和 2 分别只有 1 个数位为 1 。数组变为 [4,2,8,30,15] 。
- 交换 nums[0] 和 nums[1] 。4 和 2 分别只有 1 个数位为 1 。数组变为 [2,4,8,30,15] 。
- 交换 nums[3] 和 nums[4] 。30 和 15 分别有 4 个数位为 1 ,数组变为 [2,4,8,15,30] 。
数组变成有序的,所以我们返回 true 。
注意我们还可以通过其他的操作序列使数组变得有序。

示例 2:

输入:nums = [1,2,3,4,5]
输出:true
解释:数组已经是有序的,所以我们返回 true 。

示例 3:

输入:nums = [3,16,8,4,2]
输出:false
解释:无法通过操作使数组变为有序。

 

提示:

原站题解

去查看

上次编辑到这里,代码来自缓存 点击恢复默认模板
class Solution { public: bool canSortArray(vector<int>& nums) { } };

rust 解法, 执行用时: 4 ms, 内存消耗: 2.1 MB, 提交时间: 2024-07-13 01:13:18

impl Solution {
    pub fn can_sort_array(nums: Vec<i32>) -> bool {
        let mut last_cnt = 0;
        let mut last_group_max = 0;
        let mut cur_group_max = 0;

        for num in nums {
            let cur_cnt = num.count_ones();
            if cur_cnt == last_cnt {
                cur_group_max = cur_group_max.max(num);
            } else {
                last_cnt = cur_cnt;
                last_group_max = cur_group_max;
                cur_group_max = num;
            }
            if num < last_group_max {
                return false;
            }
        }
        true
    }
}

javascript 解法, 执行用时: 82 ms, 内存消耗: 52.6 MB, 提交时间: 2024-07-13 01:13:01

/**
 * @param {number[]} nums
 * @return {boolean}
 */
var canSortArray = function(nums) {
    let lastCnt = 0;
    let lastGroupMax = 0;
    let curGroupMax = 0;

    for (let num of nums) {
        let curCnt = countBits(num);
        if (curCnt === lastCnt) {
            curGroupMax = Math.max(curGroupMax, num);
        } else {
            lastCnt = curCnt;
            lastGroupMax = curGroupMax;
            curGroupMax = num;
        }
        if (num < lastGroupMax) {
            return false;
        }
    }
    return true;
};

const countBits = (num) => {
    let count = 0;
    while (num !== 0) {
        count++;
        num &= num - 1;
    }
    return count;
}

golang 解法, 执行用时: 3 ms, 内存消耗: 3.4 MB, 提交时间: 2024-01-21 20:33:13

func canSortArray(nums []int) bool {
	preMax := 0
	for i, n := 0, len(nums); i < n; {
		mn, mx := nums[i], nums[i]
		ones := bits.OnesCount(uint(mn))
		for i++; i < n && bits.OnesCount(uint(nums[i])) == ones; i++ {
			mn = min(mn, nums[i])
			mx = max(mx, nums[i])
		}
		if mn < preMax {
			return false
		}
		preMax = mx
	}
	return true
}

func canSortArray2(nums []int) bool {
	for i, n := 0, len(nums); i < n; {
		start := i
		ones := bits.OnesCount(uint(nums[i]))
		i++
		for i < n && bits.OnesCount(uint(nums[i])) == ones {
			i++
		}
		slices.Sort(nums[start:i])
	}
	return slices.IsSorted(nums)
}

cpp 解法, 执行用时: 18 ms, 内存消耗: 30.9 MB, 提交时间: 2024-01-21 20:32:41

class Solution {
public:
    bool canSortArray(vector<int> &nums) {
        for (int i = 0, n = nums.size(); i < n;) {
            int start = i;
            int ones = __builtin_popcount(nums[i++]);
            while (i < n && __builtin_popcount(nums[i]) == ones) {
                i++;
            }
            sort(nums.begin() + start, nums.begin() + i);
        }
        return ranges::is_sorted(nums);
    }

    bool canSortArray2(vector<int> &nums) {
        int n = nums.size();
        int i = 0, pre_max = 0;
        while (i < n) {
            int mn = nums[i], mx = mn;
            int ones = __builtin_popcount(mn);
            for (i++; i < n && __builtin_popcount(nums[i]) == ones; i++) {
                mn = min(mn, nums[i]);
                mx = max(mx, nums[i]);
            }
            if (mn < pre_max) {
                return false;
            }
            pre_max = mx;
        }
        return true;
    }
};

java 解法, 执行用时: 1 ms, 内存消耗: 43.5 MB, 提交时间: 2024-01-21 20:32:13

class Solution {
    public boolean canSortArray(int[] nums) {
        int n = nums.length;
        int i = 0, preMax = 0;
        while (i < n) {
            int mn = nums[i], mx = mn;
            int ones = Integer.bitCount(mn);
            for (i++; i < n && Integer.bitCount(nums[i]) == ones; i++) {
                mn = Math.min(mn, nums[i]);
                mx = Math.max(mx, nums[i]);
            }
            if (mn < preMax) {
                return false;
            }
            preMax = mx;
        }
        return true;
    }

    public boolean canSortArray2(int[] nums) {
        int n = nums.length;
        for (int i = 0; i < n; ) {
            int start = i;
            int ones = Integer.bitCount(nums[i++]);
            while (i < n && Integer.bitCount(nums[i]) == ones) {
                i++;
            }
            Arrays.sort(nums, start, i);
        }
        for (int i = 1; i < n; i++) {
            if (nums[i] < nums[i - 1]) {
                return false;
            }
        }
        return true;
    }
}

python3 解法, 执行用时: 51 ms, 内存消耗: 16.3 MB, 提交时间: 2024-01-21 20:31:17

class Solution:
    def canSortArray(self, nums: List[int]) -> bool:
        n = len(nums)
        i = 0
        while i < n:
            start = i
            ones = nums[i].bit_count()
            i += 1
            while i < n and nums[i].bit_count() == ones:
                i += 1
            nums[start:i] = sorted(nums[start:i])
        return all(x <= y for x, y in pairwise(nums))
        
        

    def canSortArray2(self, nums: List[int]) -> bool:
        n = len(nums)
        i = pre_max = 0
        while i < n:
            mn = mx = nums[i]
            ones = mn.bit_count()
            i += 1
            while i < n and nums[i].bit_count() == ones:
                x = nums[i]
                if x < mn:
                    mn = x
                elif x > mx:
                    mx = x
                i += 1
            if mn < pre_max:
                return False
            pre_max = mx
        return True

上一题