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

运行结果

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

相关推荐
挥剑决浮云 -4 分钟前
Linux 之 安装软件、GCC编译器、Linux 操作系统基础
linux·服务器·c语言·c++·经验分享·笔记
Mephisto.java17 分钟前
【力扣 | SQL题 | 每日四题】力扣2082, 2084, 2072, 2112, 180
sql·算法·leetcode
robin_suli18 分钟前
滑动窗口->dd爱框框
算法
丶Darling.20 分钟前
LeetCode Hot100 | Day1 | 二叉树:二叉树的直径
数据结构·c++·学习·算法·leetcode·二叉树
labuladuo52030 分钟前
Codeforces Round 977 (Div. 2) C2 Adjust The Presentation (Hard Version)(思维,set)
数据结构·c++·算法
jiyisuifeng199141 分钟前
代码随想录训练营第54天|单调栈+双指针
数据结构·算法
小柯J桑_1 小时前
C++:STL简介
c++·stl
꧁༺❀氯ྀൢ躅ྀൢ❀༻꧂1 小时前
实验4 循环结构
c语言·算法·基础题
新晓·故知1 小时前
<基于递归实现线索二叉树的构造及遍历算法探讨>
数据结构·经验分享·笔记·算法·链表
咖啡里的茶i1 小时前
C++之继承
c++