Leetcode—3011. 判断一个数组是否可以变为有序【中等】(__builtin_popcount()、ranges::is_sorted())

2024每日刷题(144)

Leetcode---3011. 判断一个数组是否可以变为有序

O(n)复杂度实现代码

cpp 复制代码
class Solution {
public:
    bool canSortArray(vector<int>& nums) {
        // 二进制数位下1数目相同的元素就不进行组内排序
        // 只进行分组
        // 当前组的值若小于上一组的最大值, 就立即返回false
        int curMax = nums[0];
        int preMax = INT_MIN;
        for(int i = 0; i < nums.size(); i++) {
            int n = __builtin_popcount(nums[i]);
            while(i < nums.size() && __builtin_popcount(nums[i]) == n) {
                if(nums[i] < preMax) {
                    return false;
                }
                curMax = max(curMax, nums[i]);
                i++;
            }
            preMax = curMax;
            i--;
        }
        return true;
    }
};

运行结果

sort实现代码

cpp 复制代码
class Solution {
public:
    bool canSortArray(vector<int>& nums) {
        int start = 0;
        for(int i = 1; i < nums.size(); i++) {
            int n = __builtin_popcount(nums[start]);

            // 先找到二进制数位为1的数目相同组
            while(i < nums.size() && __builtin_popcount(nums[i]) == n) {
                i++;
            }

            // 然后组内冒泡排序
            ranges::sort(nums.begin() + start, nums.begin() + i);
            start = i;
        }
        return ranges::is_sorted(nums);
    }
};

运行结果

之后我会持续更新,如果喜欢我的文章,请记得一键三连哦,点赞关注收藏,你的每一个赞每一份关注每一次收藏都将是我前进路上的无限动力 !!!↖(▔▽▔)↗感谢支持!

相关推荐
疯狂的喵5 小时前
C++编译期多态实现
开发语言·c++·算法
scx201310045 小时前
20260129LCA总结
算法·深度优先·图论
2301_765703145 小时前
C++中的协程编程
开发语言·c++·算法
m0_748708055 小时前
实时数据压缩库
开发语言·c++·算法
小魏每天都学习5 小时前
【算法——c/c++]
c语言·c++·算法
智码未来学堂6 小时前
探秘 C 语言算法之枚举:解锁解题新思路
c语言·数据结构·算法
Halo_tjn6 小时前
基于封装的专项 知识点
java·前端·python·算法
春日见6 小时前
如何避免代码冲突,拉取分支
linux·人工智能·算法·机器学习·自动驾驶
副露のmagic6 小时前
更弱智的算法学习 day59
算法
m0_748233176 小时前
30秒掌握C++核心精髓
开发语言·c++