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

运行结果

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

相关推荐
charlie1145141913 分钟前
深入理解Qt的SetWindowsFlags函数
开发语言·c++·qt·原理分析
呜喵王阿尔萨斯10 分钟前
编程中的英语
c语言·c++
糖葫芦君31 分钟前
Policy Gradient【强化学习的数学原理】
算法
whoarethenext1 小时前
使用 C++/Faiss 加速海量 MFCC 特征的相似性搜索
开发语言·c++·faiss
向阳@向远方2 小时前
第二章 简单程序设计
开发语言·c++·算法
Mr_Xuhhh3 小时前
信号与槽的总结
java·开发语言·数据库·c++·qt·系统架构
github_czy3 小时前
RRF (Reciprocal Rank Fusion) 排序算法详解
算法·排序算法
liulilittle3 小时前
VGW 虚拟网关用户手册 (PPP PRIVATE NETWORK 基础设施)
开发语言·网络·c++·网关·智能路由器·路由器·通信
许愿与你永世安宁4 小时前
力扣343 整数拆分
数据结构·算法·leetcode
爱coding的橙子4 小时前
每日算法刷题Day42 7.5:leetcode前缀和3道题,用时2h
算法·leetcode·职场和发展