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);
    }
};

运行结果

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

相关推荐
CHNLee玉米2 分钟前
题目解析 1.找单独的数 | 豆包MarsCode AI刷题
算法
緈福的街口3 分钟前
【leetcode】20. 有效的括号
linux·算法·leetcode
小程序华东同舟求职12 分钟前
25年宁德时代新能源科技SHL 测评语言理解数字推理Verify题库
经验分享·面试·职场和发展·求职招聘
PixelMind1 小时前
【LUT技术专题】图像自适应3DLUT代码讲解
人工智能·python·算法·lut
czxyvX2 小时前
06-排序
c语言·数据结构·算法·排序算法
得物技术2 小时前
得物自研DScript2.0脚本能力从0到1演进
c++
2301_820301022 小时前
【机器学习】支持向量机
算法·机器学习·支持向量机
拾忆-eleven2 小时前
NLP学习路线图(二十):FastText
人工智能·算法·机器学习·nlp
你真会3 小时前
【数据结构知识分享】顺序表详解
数据结构·学习·算法
Two_brushes.3 小时前
高性能分布式消息队列系统(二)
c++·后端·mq