力扣每日一题:3011. 判断一个数组是否可以变为有序

力扣官网:前往作答!!!!

今日份每日一题:

题目要求:

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

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

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


示例如下:

示例1

输入:nums = [8,4,2,30,15]
输出:true
解释:我们先观察每个元素的二进制表示。 2 ,4 和 8 分别都只有一个数位为 1 ,分别为 “10” ,“100” 和 “1000” 。15 和 30 分别有 4 个数位为 1 :“1111” 和 “11110” 。
我们可以通过 4 个操作使数组有序:

  • 交换 nums[0] 和 nums[1] 。8 和 4 分别只有 1 个数位为 1 。数组变为 [4,8,2,30,15] 。
  • 交换 nums[1] 和 nums[2] 。8 和 2 分别只有 1 个数位为 1 。数组变为 [4,2,8,30,15] 。
  • 交换 nums[0] 和 nums[1] 。4 和 2 分别只有 1 个数位为 1 。数组变为 [2,4,8,30,15] 。
  • 交换 nums[3] 和 nums[4] 。30 和 15 分别有 4 个数位为 1 ,数组变为 [2,4,8,15,30] 。

数组变成有序的,所以我们返回 true 。
注意我们还可以通过其他的操作序列使数组变得有序。

示例2

输入:nums = [1,2,3,4,5]
输出:true
解释:数组已经是有序的,所以我们返回 true 。

示例3

输入:nums = [3,16,8,4,2]
输出:false
解释:无法通过操作使数组变为有序。

解释

剖析示例

示例1

其实还是比较好理解的:

  • 最简单的情况,也就是示例1
  • 我们可以把这一整个数组根据二进制中1的个数分为几个小组,如果在小组中能够进行排序那么就可以完成升序排序

请添加图片描述

在示例一中,按照二进制中1的个数进行划分,我们可以发现:

  • 整个数组可以分为两个小组
  • 而两个小组中间没有被分割

那么这种情况下:我们只需要判断前一个小组的最大数是否大于后面小组的任意一个数

  • 此时前一个小组的最大值为8
  • 8小于任何一个后面组的数
  • 所以可以通过交换得到有序序列
示例2

请添加图片描述
从上图我们可以看到:

  • 小组和小组之间被隔开了
  • 此时的分组应为4个:1,2为个数为1的第一组;3为个数为2的第二组;4为个数为1的第三组,5为个数为2的第四组

那么我们可以开始判断

  • 前一个小组的最大值是否大于后一个组的任意一个值:
  • 第一组的最大值2小于第二组的3
  • 第二组的最大值3小于第三组的4
  • 第三组的最大值4小于第四组的5
  • 所以可以通过交换得到有序序列
示例3

请添加图片描述
再次使用公式做题:

  • 前一个小组的最大值是否大于后一个组的任意一个值:
  • 第一组的最大值3大于后一组中的2
  • 所以不能通过交换得到有序序列。

将逻辑思路转换为代码

逻辑思路:

  • 获取当前数字的二进制中的1的个数
  • 按照1的个数进行分类
  • 前一个小组的最大值是否大于后一个组的任意一个值

这里有个小细节:我们不需要通过很多个数组将值进行物理分割,我们只需要记录当前的1的个数是否和前一个相同,相同就是一个组,不同就是不同组

代码:

  • 一个变量记录当前值的二进制中1的个数
  • 一个变量记录上一个组的二进制中1的个数
  • 一个变量记录当前组中最大的值(主要是用来传递,当进入下一个组时,当前组最大值就变为了上一个组的最大值)
  • 一个变量记录上一个组中最大的值
  • 循环遍历数组
  • 当此变量和上一个变量为同一组,那么判断此变量是否大于当前组的最大值
  • 当此变量和上一个变量不为一个组,那么更新变量(当前组最大值就变为了上一个组的最大值,上一个值的二进制中1的个数变为当前值的二进制中1的个数,当前组最大值变为了这个变量)
  • 而当上一个组别的最大值大于新组中的任意一个值,则直接返回false
  • 循环结束后,返回true(表示的是循环中没有一个前一个小组的最大值大于后一个组的任意一个值)

那么具体代码如下所示:(模仿官解,只是用于讲解,不喜勿喷)

    bool canSortArray(vector<int>& nums) {int curNum;//用来记录当前值的二进制中1的个数int lastNum;//用来记录上一个组的二进制中1的个数int lastNumMax;//用来记录上一个组的最大值int curNumMax;//用来记录这个组最大值for(int i = 0;i<nums.size();i++){int curNum = __builtin_popcount(nums[i]); 	//封装的函数,用来获取变量值转为2进制后1的个数int n = nums[i];							//简单变量,就是当前值if(curNum == lastNum){						//当当前值和上一个值为同一组curNumMax = fmax(curNumMax,n);			//判断组别中的最大值和当前值谁更大,谁更大就是谁}else{										//当当前值和上一个值不为同一组lastNum = curNum;						//上一个组的二进制中1的个数变为当前值的二进制中1的个数lastNumMax = curNumMax;					//上一个组的最大值变为这个组最大值curNumMax = n;							//当前组的最大值变为此变量}if(n < lastNumMax){							//最最重要的判断前一个小组的最大值是否大于后一个组的任意一个值return false;							//如果是,直接返回false}}return true;									//循环中没有一个前一个小组的最大值大于后一个组的任意一个值,返回true}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/diannao/45949.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Cxx Primer-CP-2

开篇第一句话足见作者的高屋建瓴&#xff1a;类型决定程序中数据和操作的意义。随后列举了简单语句i i j;的意义取决于i和j的类型。若它们都是整形&#xff0c;则为通常的算术意义。若它们都为字符串型&#xff0c;则为进行拼接操作。若为用户自定义的class类型&#xff0c;则…

为Linux设置GRUB密码

正文共&#xff1a;999 字 11 图&#xff0c;预估阅读时间&#xff1a;1 分钟 我们前面介绍了如何恢复root密码&#xff08;CentOS 7.9遗忘了root密码怎么办&#xff1f;&#xff09;&#xff0c;虽然简单好用&#xff0c;但是可能会被不法分子利用&#xff0c;造成root密码以及…

快速读出linux 内核中全局变量

查问题时发现全局变量能读出来会提高效率&#xff0c;于是考虑从怎么读出内核态的全局变量&#xff0c;脚本如下 f open("/proc/kcore", rb) f.seek(4) # skip magic assert f.read(1) b\x02 # 64 位def read_number(bytes):return int.from_bytes(bytes, little,…

【FineReport的详细使用教程】

前言&#xff1a; &#x1f49e;&#x1f49e;大家好&#xff0c;我是书生♡&#xff0c;今天主要和大家分享一下&#xff0c;BI报表中的FineRoport 的详细使用&#xff0c;以及它的优势&#xff01;&#xff01;&#xff01;希望对大家有所帮助。 &#x1f49e;&#x1f49e;代…

C# Winform布局控件的几种方式

在 C# WinForms 应用程序中&#xff0c;布局控件和布局管理器可以帮助开发者创建响应式的用户界面&#xff0c;即使在窗口大小改变时也能保持控件的正确位置和尺寸。 通常我们采用Panel和Dock&#xff0c;辅助Anchor实现类似如下的布局。 以下是几种常见的布局控件和方法&…

计算机网络通信

1、最原始的hub结构 2、局域网的交换机&#xff1a;mac和交换机端口路由表-数据链路层 mac地址 3、不同局域网之间进行通信&#xff0c;主要是路由器-网络层-ip 源ip到目标ip的不变化&#xff0c;但是mac地址在一直变化

Linux--信号量

线程系列&#xff1a; Linux–线程的认识(一) Linux–线程的分离、线程库的地址关系的理解、线程的简单封装&#xff08;二&#xff09; 线程的互斥&#xff1a;临界资源只能在同一时间被一个线程使用 生产消费模型 信号量 信号量&#xff08;Semaphore&#xff09;是在多线程…

基于PyTorch深度学习实践技术应用

近年来&#xff0c;Python语言由于其开源、简单等特点&#xff0c;受到了广大程序开发者的偏爱&#xff0c;丰富的函数库使得其在各行各业中得到了广泛的应用。伴随着新一轮人工智能&#xff08;尤其是深度学习&#xff09;的快速发展&#xff0c;许多深度学习框架应运而生&…

通义千问Qwen-VL-Chat大模型本地训练(二)

目录 前言 环境准备 软件安装 数据准备 模型训练 模型名称修改 数据集修改 模型参数修改 数据读取编码修改 output_dir修改 模型调用 验证 小结 前言 人工智能大模型是一种能够利用大数据和神经网络来模拟人类思维和创造力的人工智能算法。它利用海量的数据和深度学习技…

中职网络安全B模块Cenots6.8数据库

任务环境说明&#xff1a; ✓ 服务器场景&#xff1a;CentOS6.8&#xff08;开放链接&#xff09; ✓ 用户名&#xff1a;root&#xff1b;密码&#xff1a;123456 进入虚拟机操作系统&#xff1a;CentOS 6.8&#xff0c;登陆数据库&#xff08;用户名&#xff1a;root&#x…

【C++深度探索】全面解析多态性机制(二)

&#x1f525; 个人主页&#xff1a;大耳朵土土垚 &#x1f525; 所属专栏&#xff1a;C从入门至进阶 这里将会不定期更新有关C/C的内容&#xff0c;欢迎大家点赞&#xff0c;收藏&#xff0c;评论&#x1f973;&#x1f973;&#x1f389;&#x1f389;&#x1f389; 前言 我…

Debezium日常分享系列之:Debezium 3.0.0.Alpha1 Released

Debezium日常分享系列之&#xff1a;Debezium 3.0.0.Alpha1 Released 一、重大改变Java 和 Maven 要求已更改 二、新的特征和提高MongoDB 三、更多内容 Debezium 3 的第一个预发布版本 3.0.0.Alpha1。这个版本虽然比正常的预版本要小&#xff0c;但高度关注几个关键点&#xff…

《财经日报》︱揭秘随身WiFi市场乱象与格行的破局之路 格行如何树立行业清流新标杆? 随身WiFi真的靠谱吗?

在移动互联网高速发展的今天&#xff0c;随身WiFi以其便捷性和高性价比迅速成为市场宠儿。然而&#xff0c;随着行业的迅速扩张&#xff0c;一系列乱象与套路也逐渐浮出水面&#xff1a;从虚假宣传到限速虚量&#xff0c;随身WiFi行业中的种种套路让消费者防不胜防。商家利用信…

c语言题目之求两个整数的二进制位数的不同个数

文章目录 一、题目二、分析三、代码实现 提示&#xff1a;以下是本篇文章正文内容&#xff0c;下面案例可供参考 一、题目 二、分析 首先看到这道题我们是求两个整数的二进制位不同位的个数&#xff0c;在操作符中我们详细学到到了按位操作符相关的内容&#xff0c;首先看到要…

三相感应电机建模仿真(5):考虑铁耗时静止dq坐标系的数学模型及其仿真模型

1.概述 2.考虑铁耗时的三相感应电机数学模型 3.考虑铁耗时的三相感应电机仿真模型 4.仿真实例 5.总结 6.参考文献 1.概述 电机的铁心损耗主要包括涡流损耗和磁滞损耗,这些损耗以热的形式消耗能量,减少了电动机的有效输出功率,对电机效率产生影响;铁心损耗会导致电机内…

【教程】Vue2中使用svg矢量图

1.npm导包 npm i svg-sprite-loader --save2.创建目录放入svg文件&#xff0c;创建SvgIcon.js 3.SvgIcon.js const req require.context(./svg, false, /\.svg$/) const requireAll requireContext > requireContext.keys().map(requireContext) requireAll(req)4.vue.c…

【前端】零基础学会编写CSS

一、什么是CSS CSS (Cascading Style Sheets&#xff0c;层叠样式表&#xff09;是一种是一种用来为结构化文档&#xff08;如 HTML 文档&#xff09;添加样式&#xff08;字体、间距和颜色等&#xff09;的计算机语言&#xff0c;能够对网页中元素位置的排版进行像素级别的精…

【数据结构取经之路】二叉搜索树的实现

目录 前言 二叉搜索树 概念 性质 二叉搜索树的实现 结点的定义 插入 查找 删除 二叉搜索树完整代码 前言 首先&#xff0c;二叉搜索树是一种数据结构&#xff0c;了解二叉搜素树有助于理解map和set的特性。 二叉搜索树 概念 二叉搜索树又称二叉排序树&#xff0c…

【Caffeine】⭐️SpringBoot 项目整合 Caffeine 实现本地缓存

目录 &#x1f378;前言 &#x1f37b;一、Caffeine &#x1f37a;二、项目实践 2.1 环境准备 2.2 项目搭建 2.3 接口测试 ​&#x1f49e;️三、章末 &#x1f378;前言 小伙伴们大家好&#xff0c;缓存是提升系统性能的一个不可或缺的工具&#xff0c;通过缓存可以避免大…