Leetcode3011. 判断一个数组是否可以变为有序

Every day a Leetcode

题目来源:3011. 判断一个数组是否可以变为有序

解法1:分组循环 + 排序

适用场景:按照题目要求,数组会被分割成若干组,每一组的判断/处理逻辑是相同的。

核心思想:

  1. 外层循环负责遍历组之前的准备工作(记录开始位置),和遍历组之后的工作(排序)。
  2. 内层循环负责遍历组,找出这一组最远在哪结束。

这个写法的好处是,各个逻辑块分工明确,也不需要特判最后一组(易错点)。

用分组循环找到一个组, 对这个组排序,最后判断整个数组是否有序。

代码:

/*
 * @lc app=leetcode.cn id=3011 lang=cpp
 *
 * [3011] 判断一个数组是否可以变为有序
 */

// @lc code=start
class Solution
{
public:
    bool canSortArray(vector<int> &nums)
    {
        int n = nums.size();
        int i = 0;

        // 分组循环
        while (i < n) // 外层循环
        {
            int ones = countOne(nums[i]);
            int start = i;
            // 内层循环
            while (i < n && countOne(nums[i]) == ones)
                i++;
            // 循环结束后 nums[start,...,i) 是一个区间
            sort(nums.begin() + start, nums.begin() + i);
        }
        return is_sorted(nums.begin(), nums.end());
    }
    // 辅函数 - 计算 x 在二进制下数位为 1 的数目
    int countOne(int x)
    {
        int count = 0;
        while (x)
        {
            count += x % 2;
            x /= 2;
        }
        return count;
    }
};
// @lc code=end

结果:

在这里插入图片描述

复杂度分析:

时间复杂度:O(nlogn),其中 n 是数组 nums 的元素个数。

空间复杂度:O(1)。

解法2:分组循环

也可以记录每一段的最小值和最大值。

对于每一段,如果这一段的每个数,都大于等于上一段的最大值,那么我们就能把数组排成递增的,否则不行。

代码:

class Solution {
public:
    bool canSortArray(vector<int> &nums) {
        int n = nums.size();
        int i = 0, pre_max = 0;
        while (i < n) {
            int mx = nums[i];
            int ones = __builtin_popcount(mx);
            while (i < n && __builtin_popcount(nums[i]) == ones) {
                if (nums[i] < pre_max) {
                    return false;
                }
                mx = max(mx, nums[i++]);
            }
            pre_max = mx;
        }
        return true;
    }
};

复杂度分析:

时间复杂度:O(n),其中 n 是数组 nums 的元素个数。

空间复杂度:O(1)。

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

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

相关文章

计算机网络-广域通信网

1.广域网概念和分类 什么是广域网&#xff1f; 广域网是指长距离跨地区的各种局域网、计算机、终端互联在一起&#xff0c;组成一个资源共享的通信网络。 广域网分为传统广域网和现代广域网。 传 统 广 域 网公共交换电话网PSTN公共数据网X.25帧中继网FR综合业务数据网ISDN…

三.重新回炉Spring Framework:Resource资源加载策略

1. Spring Framework中的资源Resource 1.1 Resource的源码 在org.springframework.core.io包中的Resource接口&#xff0c;作为所有资源的统一抽象&#xff0c;它继承 org.springframework.core.io.InputStreamSource接口&#xff0c;在Resource 定义了一些通用的方法&#x…

户用光伏开发如何做到病毒式推广?

随着全球对可再生能源的需求日益增加&#xff0c;户用光伏作为一种清洁、高效的能源解决方案&#xff0c;正受到越来越多的关注和青睐。然而&#xff0c;如何有效地推广户用光伏&#xff0c;使其迅速传播&#xff0c;成为当前行业面临的重要课题。 一、明确目标群体&#xff0…

SpringBoot常见问题

1 引言 Spring Boot是一个基于Spring框架的快速开发脚手架&#xff0c;它简化了Spring应用的初始化和搭建过程&#xff0c;提供了众多便利的功能和特性&#xff0c;比如自动配置、嵌入式Tomcat等&#xff0c;让开发人员可以更加专注于业务逻辑的实现。   Spring Boot还提供了…

【CANoe示例分析】EthernetTC8Test

1、工程路径 C:\Users\Public\Documents\Vector\CANoe\Sample Configurations 15.3.89\Ethernet\Test\EthernetTC8Test 在CANoe软件上也可以打开此工程:File|Help|Sample Configurations|Ethernet Testing|TC8Test(Ethernet) 2、示例目的 TC8示例是作者本人使用最多的CANo…

macOS上使用VScode编译配置C++语言开发环境

本文介绍macOS上使用VScode编译配置C语言开发环境 1.准备工作 安装C/C插件 2.配置c_cpp_properties.json文件 [⇧⌘P]打开命令模式&#xff0c;选择[C/Cpp: Edit Configurations(JSON)]命令&#xff0c;回车后会自动生成一个.vscode目录&#xff0c;目录下有一个c_cpp_prope…

ADS-B Receiver Module TT-SC1 for UAV and Drones

目录 Introduction Applications Main features Technical parameters Basic technical information Electrical specification Recommended operation conditions General electrical parameters Introduction TT-SC1 is a high quality and low price OEM ADS-B…

ActiveMQ高可用架构涉及常用功能整理

ActiveMQ高可用架构涉及常用功能整理 1. activemq的集群模式2. 镜像模式高可用系统架构和相关组件2.1 架构说明2.2 相关概念说明2.3 消息模型2.3.1 点对点2.3.2 发布订阅 3. activemq常用命令4. activemq配置集群5. 疑问和思考5.1 activemq的数据删除策略是怎样的&#xff1f;5…

Kubernetes基础(二十二)-K8S的PV/PVC/StorageClass详解

1 概述 先来个一句话总结&#xff1a;PV、PVC是K8S用来做存储管理的资源对象&#xff0c;它们让存储资源的使用变得可控&#xff0c;从而保障系统的稳定性、可靠性。StorageClass则是为了减少人工的工作量而去自动化创建PV的组件。所有Pod使用存储只有一个原则&#xff1a;先规…

京津冀光伏展

京津冀光伏展是一场专门展示京津冀地区光伏产业发展成果的展览会。光伏是指利用太阳能将光线转化为电能的技术&#xff0c;是可再生能源领域的一项重要技术。京津冀地区作为中国重要的经济区域&#xff0c;光伏产业在该地区得到了快速发展&#xff0c;并取得了丰硕的成果。 京津…

SQL注入工具之SQLmap入门操作

了解SQLmap 基础操作 SQLmap是一款自动化的SQL注入工具&#xff0c;可以用于检测和利用SQL注入漏洞。 以下是SQLmap的入门操作步骤&#xff1a; 1.下载SQLmap&#xff1a;可以从官方网站&#xff08;https://sqlmap.org/&#xff09;下载最新版本的SQLmap。 2.打开终端&#…

VSCode React JavaScript Snippets 插件的安装与使用指南

VSCode React JavaScript Snippets 插件的安装与使用指南 在开发 React 项目时&#xff0c;提高效率是每个开发者都追求的目标之一。VSCode React JavaScript Snippets 插件就是为了提升 React 开发效率而设计的&#xff0c;它为常用的 React 代码片段提供了快捷键&#xff0c;…

解决kkFileView4.4.0版本pdf、word不能预览问题

这里使用的是http下载流url预览&#xff0c;遇到的问题。 官方使用指南&#xff1a;kkFileView - 在线文件预览 1 前端测试代码 1.1 官方示例代码 1.2 本人测试代码 注意&#xff1a;要给预览文件的url进行编码encodeURIComponent(Base64.encode(previewUrl))。 <!DOCTYP…

面试redis篇-03缓存击穿

原理 缓存击穿&#xff1a;给某一个key设置了过期时间&#xff0c;当key过期的时候&#xff0c;恰好这时间点对这个key有大量的并发请求过来&#xff0c;这些并发的请求可能会瞬间把DB压垮 解决方案一&#xff1a;互斥锁 解决方案二&#xff1a;逻辑过期 提问与回答 面试官 &a…

滤波电阻器:用于能源系统和工业的高精度解决方案(1)?

滤波电阻器用于防止能源系统中的电源反馈。铝厂或钢铁厂中的大型感应冶炼厂会产生与电源频率的谐波。必须不惜一切代价让这些远离电网。过滤器&#xff0c;通常以 T 或 L 元素的形式用于此目的。中压电源输入端的吸收电路由电容和电感的串联连接组成&#xff0c;对谐波进行负载…

[ansible] playbook运用

一、复习playbook剧本 --- - name: first play for install nginx #设置play的名称gather_facts: false #设置不收集facts信息hosts: webservers:dbservers #指定执行此play的远程主机组remote_user: root #指定执行此play的用…

PCIe学习笔记(2)错误处理和AER/DPC功能

文章目录 PCIe ErrorAER (Advanced Error Reporting)DPC (Downstream Port Containment) 处理器上错误通常可分为detected和undetected error。Undetected errors可能变得良性(benign)&#xff0c;也可能导致系统故障如silent data corruptions (SDC)。Detected errors则又可分…

自养号测评低成本高效率推广,安全可控

测评的作用在于让用户更真实、清晰、快捷地了解产品以及产品的使用方法和体验。通过买家对产品的测评&#xff0c;也可以帮助厂商和卖家优化产品缺陷&#xff0c;提高用户的使用体验。这进而帮助他们获得更好的销量&#xff0c;并更深入地了解市场需求。因此&#xff0c;测评在…

Java 学习和实践笔记(14)

OOP :面向对象编程&#xff0c;object oriented programming. 用表格就可以很好地理解类、对象、属性、以及动作这些概念。 一个表&#xff08;结构&#xff09;就对应一个类&#xff08;结构&#xff09;。所以凡叫什么类&#xff0c;自己就在心里把它叫什么表。反过来&…

消息队列-RabbitMQ:MQ作用分类、RabbitMQ核心概念及消息生产消费调试

1、MQ 的相关概念 1&#xff09;什么是 MQ MQ (message queue)&#xff0c;从字面意思上看&#xff0c;本质是个队列&#xff0c;FIFO 先入先出&#xff0c;只不过队列中存放的内容是 message 而已&#xff0c;还是一种跨进程的通信机制&#xff0c;用于上下游传递消息。在互…
最新文章