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

运行结果

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

相关推荐
淀粉肠kk3 分钟前
【C++11】智能指针详解
开发语言·c++
一个人旅程~8 分钟前
Win旧版或win10部分版本如何解除260字符长路径名限制?
linux·windows·经验分享·电脑
iEdHu12 分钟前
LinuxDO | L站 | Linux.do邀请码2026最新获取方式【邀请链接每日分享】
linux·经验分享·其他·社交电子
不想写代码的星星16 分钟前
COW(Copy-on-Write):开抄开抄,哎嘿,我装的
开发语言·c++
Sylvia-girl20 分钟前
C++内存如何管理?
java·jvm·c++
shehuiyuelaiyuehao22 分钟前
算法14,滑动窗口,找到字符串中所有字母异位词
算法
凯瑟琳.奥古斯特22 分钟前
图论核心考点精讲
开发语言·数据结构·算法·排序算法·哈希算法
WolfGang00732128 分钟前
代码随想录算法训练营 Day49 | 图论 part07
算法·图论
啦啦啦_999928 分钟前
案例之 逻辑回归_癌症预测
算法·机器学习·逻辑回归
StockTV32 分钟前
韩国股票实时数据 KOSPI(主板)和 KOSDAQ(创业板)的实时行情、K 线及指数数据
java·开发语言·算法·php