class Solution {
public:
bool canSortArray(vector<int>& nums) {
}
};
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 解释:无法通过操作使数组变为有序。
提示:
1 <= nums.length <= 100
1 <= nums[i] <= 28
原站题解
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