力扣每日一题: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
    }

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

Manim的代码练习02:在manim中Dot ,Arrow和NumberPlane对象的使用

Dot&#xff1a;指代点对象或者表示点的符号。Arrow&#xff1a;指代箭头对象&#xff0c;包括直线上的箭头或者向量箭头等。NumberPlane&#xff1a;指代数轴平面对象&#xff0c;在Manim中用来创建包含坐标轴的数学坐标系平面。Text&#xff1a;指代文本对象&#xff0c;用来…

WEB前端02-HTML5基础(02)

7.表格标签 在基本表格结构中&#xff0c;表格标题、项目表头和数据资料构成了表格基本结构三个要素。 table标签&#xff1a;定义表格整体 <caption>我的标题</caption>&#xff1a;表格的标题tr标签&#xff1a;定义表格的行 height&#xff1a;设置行的高度…

探索 Prompt 的世界:让你的 AI 更智能

探索 Prompt 的世界&#xff1a;让你的 AI 更智能 引言什么是 Prompt&#xff1f;Prompt 的重要性如何编写有效的 Prompt1. 清晰明确2. 包含关键细节3. 提供上下文 实践中的 Prompt 技巧1. 多次迭代2. 实验不同风格3. 结合实际应用 总结 引言 随着人工智能&#xff08;AI&…

卸载wps office的几种方法收录

​ 第一种方法: 1.打开【任务管理器】&#xff0c;找到相关程序&#xff0c;点击【结束任务】。任务管理器可以通过左下角搜索找到。 2.点击【开始】&#xff0d;【设置】&#xff0d;【应用】&#xff0d;下拉找到WPS应用&#xff0c;右键卸载&#xff0c;不保留软件配置 …

Java 设计模式系列:解释器模式

简介 解释器模式是一种行为型设计模式&#xff0c;它提供了一种构建抽象语法树的机制&#xff0c;并定义了如何解释这棵树。解释器模式属于编译原理中的语法制导翻译的范畴。 如上图&#xff0c;设计一个软件用来进行加减计算。我们第一想法就是使用工具类&#xff0c;提供对应…

【微信小程序知识点】getApp()全局数据共享,页面间通信,组件间通信

getApp()-全局数据共享 在小程序中&#xff0c;可以通过getApp()方法获取到小程序全局唯一的App实例。因此在App()方法中添加全局共享的数据&#xff0c;方法&#xff0c;从而实现页面&#xff0c;组件的数据传值。 // app.js App({//全局共享的数据globalData: {token: &qu…

prompt第二讲-langchain实现中英翻译助手

文章目录 prompt模板 (prompt template)langchain 中的prompt模板 (prompt template)langchain实现中英翻译助手 prompt模板 (prompt template) 开篇我介绍了在llm中&#xff0c;通常输入的那个字符串会被我们称之为prompt&#xff0c;下面就是一个中英文翻译助手的prompt例子…

从“Hello,World”谈起(C++入门)

前言 c的发展史及c能干什么不能干什么不是我们今天的重点&#xff0c;不在这里展开&#xff0c;有兴趣的朋友可以自行查阅相关资料。今天我们主要是围绕c的入门程序&#xff0c;写一个“hello&#xff0c;world”&#xff0c;并且围绕这个入门程序简单介绍一下c和c的一些语法&…

windows USB 设备驱动开发-USB 功能控制器驱动开发(二)

USB 功能客户端驱动程序使用的 UFX 对象和句柄 USB 函数类扩展 (UFX) 使用 WDF 对象功能来定义这些特定于 USB 的 UFX 对象。 重要的 API UfxDeviceCreateUfxEndpointCreate USB 函数类扩展 (UFX) 使用 WDF 对象功能来定义这些特定于 USB 的 UFX 对象。 这些对象是 WDF 对…

Facebook 开源计算机视觉 (CV) 和 增强现实 (AR) 框架 Ocean

Ocean 是一个独立于平台的框架&#xff0c;支持所有主要操作系统&#xff0c;包括 iOS、Android、Quest、macOS、Windows 和 Linux。它旨在彻底改变计算机视觉和混合现实应用程序的开发。 Ocean 主要使用 C 编写&#xff0c;包括计算机视觉、几何、媒体处理、网络和渲染&#x…

sentinel源码分析: dashboard与微服务的交互、pull模式持久化

文章目录 原始方式微服务端规则如何保存规则如何加载进内存微服务端接收控制台请求控制台推送规则总结 pull拉模式官方demo如何整合Spring Cloud整合Spring Cloud 前置知识 SentinelResource的实现原理、SphU.entry()方法中ProcessorSlotChain链、entry.exit() 建议先会使用se…

鸿蒙系统在服装RFID管理中的应用:打造智能零售新时代

​随着物联网技术的迅速发展&#xff0c;服装零售行业正面临着新的变革与挑战。鸿蒙系统作为新一代智能操作系统&#xff0c;结合RFID技术&#xff0c;为服装行业提供了高效、智能的管理解决方案。常达智能物联&#xff0c;作为RFID技术的领先企业&#xff0c;致力于将鸿蒙系统…

基于JavaSpringBoot+Vue+uniapp微信小程序校园宿舍管理系统设计与实现

基于JavaSpringBootVueuniapp微信小程序实现校园宿舍管理系统设计与实现 目录 第一章 绪论 1.1 研究背景 1.2 研究现状 1.3 研究内容 第二章 相关技术介绍 2.1 Java语言 2.2 HTML网页技术 2.3 MySQL数据库 2.4 Springboot 框架介绍 2.5 VueJS介绍 2.6 ElementUI介绍…

7-1、2、3 IPFS介绍使用及浏览器交互(react+区块链实战)

7-1、2、3 IPFS介绍使用及浏览器交互&#xff08;react区块链实战&#xff09; 7-1 ipfs介绍7-2 IPFS-desktop使用7-3 reactipfs-api浏览器和ipfs交互 7-1 ipfs介绍 IPFS区块链上的文件系统 https://ipfs.io/ 这个网站本身是需要科学上网的 Ipfs是点对点的分布式系统 无限…

如何在 Android Studio 中导出并在 IntelliJ IDEA 中查看应用的 SQLite 数据库

在 Android 应用开发过程中&#xff0c;调试和查看应用内的数据库内容是常见的需求。本文将介绍如何使用 Android Studio 导出应用的 SQLite 数据库&#xff0c;并在 IntelliJ IDEA 中查看该数据库。 步骤一&#xff1a;在设备上运行您的应用 首先&#xff0c;确保您的应用已…

5G-A通感融合赋能低空经济-RedCap芯片在无人机中的应用

1. 引言 随着低空经济的迅速崛起&#xff0c;无人机在物流、巡检、农业等多个领域的应用日益广泛。低空飞行器的高效、安全通信成为制约低空经济发展的关键技术瓶颈。5G-A通感一体化技术通过整合通信与感知功能&#xff0c;为低空网络提供了强大的技术支持。本文探讨了5G-A通感…

未来互联网的新篇章:深度解析Facebook的技术与战略

随着科技的飞速发展和社会的不断变迁&#xff0c;互联网作为全球信息交流的重要平台&#xff0c;正经历着前所未有的变革和演进。作为全球最大的社交媒体平台之一&#xff0c;Facebook不仅是人们沟通、分享和互动的重要场所&#xff0c;更是科技创新和数字化进程的推动者。本文…

自己动手写一个滑动验证码组件(后端为Spring Boot项目)

近期参加的项目&#xff0c;主管丢给我一个任务&#xff0c;说要支持滑动验证码。我身为50岁的软件攻城狮&#xff0c;当时正背着双手&#xff0c;好像一个受训的保安似的&#xff0c;中规中矩地参加每日站会&#xff0c;心想滑动验证码在今时今日已经是标配了&#xff0c;司空…

数据结构——考研笔记(二)线性表的定义和线性表之顺序表

文章目录 二、线性表2.1 定义、基本操作2.1.1 知识总览2.1.2 线性表的定义2.1.3 线性表的基本操作2.1.4 知识回顾与重要考点 2.2 顺序表2.2.1 知识总览2.2.2 顺序表的定义2.2.3 顺序表的实现——静态分配2.2.4 顺序表的实现——动态分配2.2.5 知识回顾与重要考点2.2.6 顺序表的…

如何在Linux上如何配置虚拟主机

在Linux上配置虚拟主机可以通过使用Apache HTTP服务器来实现。Apache是一个开源的跨平台的Web服务器软件&#xff0c;可以在多种操作系统上运行并支持虚拟主机的配置。 以下是在Linux上配置虚拟主机的步骤&#xff1a; 安装Apache HTTP服务器 在终端中运行以下命令来安装Apache…