首页 > 其他分享 >2024/7/13 每日一题:数组是否有序

2024/7/13 每日一题:数组是否有序

时间:2024-07-13 17:09:09浏览次数:16  
标签:13 int 元素 2024 num 分组 数组 curGroupMax

3011.数组是否可以变为有序

给你一个下标从 0 开始且全是 正 整数的数组 nums 。

一次 操作 中,如果两个 相邻 元素在二进制下数位为 1 的数目 相同 ,那么你可以将这两个元素交换。你可以执行这个操作 任意次 (也可以 0 次)。

如果你可以使数组变有序,请你返回 true ,否则返回 false 。

相关函数

__builtin_popcount(int): GCC提供的内建函数,返回一个整数中"1"的二进制个数。

fmax(int, int):C 标准库函数,返回两个浮点数中较大的一个。尽管它通常用于浮点数,但在某些编译器实现中,它也可以接受整数并返回较大的那个。(本题中使用 max() 函数也没有问题)


思路

一次操作中,相邻元素在二进制下数位为 1 的数目相同就可以交换这两个元素。我们可以将数组的元素进行分组,同时分组满足以下的条件:

  • 每个分组中的元素,其二进制含有“1”的数量相同。

这样我们就能够维护多个能够实现分组内元素位置能够进行互相交换的分组了。所以一个分组内,无论其如何排序,我们总是能够将这个分组内的元素交换位置从而得到一个递增的分组。

我们现在已经完成了每个分组内的有序,如何保证分组间递增呢?很简单,我们维护上一个分组的最大值lastGroupMax,同时让当前的分组值与最大值进行比较,如果当前分组值小于上一个分组的最大值,意味着不满足递增的逻辑,就不满足数组可以变为有序数组。

待到结束整个数组的遍历后,我们就能够得到一个可以变为有序的数组,因此返回True


代码

class Solution{
public:
    bool canSortArray(vector<int>& nums) {
        int lastCnt = 0;
        int curGroupMax = 0, lastGroupMax = 0;

        for (int i = 0; i < nums.size(); i++) {
            int num = nums[i];
            int curCnt = __builtin_popcount(num); // 统计当前元素“1”的个数
            /** 维护二进制元素“1”个数相同的元素 */
            if (curCnt == lastCnt) {
                curGroupMax = max(curGroupMax, num); // 维护组最大值
            } else { 
                lastCnt = curCnt;
                lastGroupMax = curGroupMax;
                curGroupMax = num;
            }
            if (num < lastGroupMax) {
                return false;
            }
        }
        
        return true;
    }
};
  • lastCnt和curCnt用于遍历并统计当前元素二进制中“1”的个数

  • lastGroupMax和curGroupMax用于维护当前分组的元素最大值

标签:13,int,元素,2024,num,分组,数组,curGroupMax
From: https://www.cnblogs.com/kristen-heu/p/18299875

相关文章

  • 题解:Codeforces CF1613C Poisoned Dagger
    标签:二分题意给定一个长度为\(n\)的序列\(a\),定义数\(k\),对于\(i>1\),如果\(a_i-a_{i-1}<k\),\(s\)加上\(a_i-a_{i-1}\),否则加上\(k\),求满足\(s\geqh\)的最小\(k\)。思路手玩样例,\(k\)越大龙死的越快,所以具有单调性,考虑二分答案。每次缩小范围时判断是否\(k\g......
  • 2024 暑假友谊赛-热身1
    1.B原题链接:https://vjudge.net/problem/AtCoder-arc100_a这是一个单峰函数,可以采取三分的方式求极值查看代码#include<bits/stdc++.h>#defineintlonglongconstintN=1e6;usingnamespacestd;intn,mi;inta[1000000];intcheck(intx){intsum=0;fo......
  • js 树形数组转一维数组,或一维数组转树形数组
    树形数组转一维数组要将一棵树结构(包含children属性)拍平为一个一维数组,可以使用递归或迭代的方法。下面是两种常见的实现方式:1.使用递归functionflattenTree(tree){letresult=[];tree.forEach(node=>{result.push(node);if(node.children){......
  • 【C++编程】数组、函数、结构体、指针、类
    数组:存储一个固定大小的相同类型元素的顺序集合声明、初始化:typearrayName[size0][size1]...={{value00,value01,...},{value10,value11,...},...};intmy_array[2][3]={{1,2,3},{4,5,6}};访问数组元素:arrayName[index0][index1]...;intget_eleme......
  • 鲜花 7.13
    来自知乎首先我们设\(f(i)\)表示凑出\(i\)的方案数,设\(m=\frac{n(n+1)}2\),然后我们先莫反,然后:\[Ans=\sum_{d|n}\mu(d)\sum_{d|i}f(i)\\\]我们考虑\(f\)的生成函数:\[F(z)=\prod_{i=1}^n(1+z^i)\]然后我们发现:\[Ans=\sum_{d|n}\mu(d)\sum_{i=1}^m[z^i][d|i]F(i)\]然......
  • 2024 暑假友谊赛 1
    1.A-......
  • 2024年8月份的护网行动如何参加?
    护网行动背景什么是“护网行动”?指挥机构∶由公安机关统一组织的"网络安全实战攻防演习"。护网分为两级演习∶公安部对总部,省厅对省级公司。什么是“实战攻防演习”每支队伍3-5人组成,明确目标系统,不限制攻击路径。提交漏洞不得分,获取权限、数据才能得分。禁止的行为......
  • 2024 暑假友谊赛-热身2
    B-RGBBoxes1.很明显其实我们会想到暴力枚举来验证加起来是否相等,但是数据范围3000,O(n3)的复杂度肯定是过不去的2.那么我们就思考如何用n2的方法来解决呢?枚举前两个数,再验证一下n-sum是不是剩下的这个数的倍数即可#include<bits/stdc++.h>#defineintlonglong#defineendl......
  • 2024 暑假友谊赛-热身2
    2024暑假友谊赛-热身2A-......
  • C语言——数组、sizeof关键字
    一、数组1.数组的引入与定义: C语言中的数组是一种基本的数据结构,用于在计算机内存中连续存储相同类型的数据。数组中的每个元素可以通过索引来访问,索引通常是一个整数,用于指定元素在数组中的位置。在C语言中,数组索引是从0开始的。 要使用数组,必须在程序中先定义数组,即通知......