力扣题解2576

news2024/11/23 12:05:42

大家好,欢迎来到无限大的频道。

今日继续给大家带来力扣题解。

题目描述:

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

一开始,所有下标都没有被标记。你可以执行以下操作任意次:

选择两个 互不相同且未标记 的下标 i 和 j ,满足 2 * nums[i] <= nums[j] ,标记下标 i 和 j 。

请你执行上述操作任意次,返回 nums 中最多可以标记的下标数目。

解题思路:

算法的核心思路是:

  1. 对数组进行排序。

  2. 使用双指针的方式遍历排序后的数组,寻找符合条件的下标。

  3. 每当找到一对符合条件的下标时,就将它们标记

        分析题目和示例,我们以更深刻地理解下标标记的逻辑。原先整数数组的下标在被标记的之后,只是数据被标记,而非其固定的位置被标记,也就是说,是因为这个数据符合条件,从而标记该位置,而不是因为该位置符合条件,而去标记数据。

    题目的关键在于标记的是数组中元素的特性,而非其在数组中的位置固定性。(这个是我个人总结出来的,在很多的算法问题中都有所体现)

    ​所以当大家理解了这个条件之后,就可以把原先的数组进行排序,从而简化问题。

排序的经典函数如下

int compare(const void *a, const void *b) {
    return (*(int *)a - *(int *)b);
}

之后便是在解决问题的函数中进行调用

    qsort(nums, numsSize, sizeof(int), compare);

在这之后,我们的数组num,就变成了一个非递减排列的数组。

排序之后,就是采用双指针遍历数组了(因为涉及两个变量的比较,所以我采用了双指针的方式)

int compare(const void *a, const void *b) {
    return (*(int *)a - *(int *)b);
}
​
int maxMarkableIndices(int* nums, int size) {
    // 先对数组进行排序
    qsort(nums, size, sizeof(int), compare);
    
    int markedCount = 0;     // 标记的下标数量
    int i = 0;                // 指向较小数字的指针
    int j = 0;                // 指向较大数字的指针
​
    // 使用双指针遍历数组
    while (i < size && j < size) {
        // 找到一对符合条件的 (i, j)
        if (2 * nums[i] <= nums[j] && i != j) {
            markedCount += 2; // 每找到一对就标记两个下标
            i++;              // 移动指针 i
            j++;              // 移动指针 j
        } else {
            // 如果不符合条件,移动 j 指针
            j++;
        }
        
        // 如果 j 指针已经达到数组的末尾,上面条件再检查时需要重置 j,给下一个 i 对应的 j
        if (j == size && i < size) {
            j = i + 1; // 对下一个 i 找 j
        }
    }
​
    return markedCount; // 返回最多可以标记的下标数量
}
//双指针:使用两个指针 i 和 j,
//其中 i 指向较小的元素,j 指向较大的元素。
//每当找到符合条件的 (i, j) 对时,就将 markedCount 增加 2,
//并移动两个指针

但是写完之后发现,这个代码的时间复杂度过高,不在题目的考虑范围之内,所以在此基础上继续优化。

在长度为 n 的数组当中,最理想的情况下只会产生 n/2 个下标数目,因为题目要求“互不相同且未标记”

由此对数组进行排序后,我们将其一分为二,左侧的元素只与右侧的元素进行匹配,其余思路同上,得出代码

int compare(const void* a, const void* b) {
    return (*(int*)a - *(int*)b);
}
​
int maxNumOfMarkedIndices(int* nums, int numsSize){
    qsort(nums, numsSize, sizeof(int), compare);
    int n = numsSize;
    int m = n / 2;
    int res = 0;
    for (int i = 0, j = m; i < m && j < n; i++) {
        while (j < n && 2 * nums[i] > nums[j]) {
            j++;
        }
        if (j < n) {
            res += 2;
            j++;
        }
    }
    return res;
}

时间复杂度:

1. 排序操作:

   - 使用 `qsort` 函数对数组进行排序,时间复杂度为 (O(n log n)),其中 (n) 是数组的大小。排序是整个算法中最耗时的部分。

2. 双指针遍历:

   - 在双指针的部分,外层循环的指针 `i` 最多会遍历 (n/2) 次(即左半边的元素),而内层循环的指针 `j` 也最多遍历 (n) 次。

   - 在最坏情况下,指针 `j` 可能会从中间走到数组的末尾,但每次内层的 `while` 循环只会向前移动 `j` 指针,因此每个元素最多只会被遍历一次。

   - 因此,双指针部分的时间复杂度为 (O(n))。

结合以上两部分,我们可以得出总的时间复杂度:

O(n log n) + O(n) = O(n log n)

 空间复杂度:

1. 排序的空间复杂度:

   - `qsort` 在排序过程中可能会使用额外的空间,具体取决于实现方式。通常情况下,快速排序的空间复杂度为 O(log n),用于递归调用的栈空间。

   - 但在某些实现中,可能会使用 O(n) 的额外空间来存储临时数组(例如归并排序),然而在这里我们使用的是快速排序。

2. 其他变量:

   - 除了排序外,其他变量(如 `n`, `m`, `res`, `i`, `j`)只占用常量空间 (O(1))。​

因此,整体的空间复杂度主要由排序决定:

O(log n)

 总结:

- 时间复杂度:(O(n log n))

- 空间复杂度:(O(log n))

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

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

相关文章

SprinBoot+Vue民宿预约微信小程序的设计与实现

目录 1 项目介绍2 项目截图3 核心代码3.1 Controller3.2 Service3.3 Dao3.4 application.yml3.5 SpringbootApplication3.5 Vue 4 数据库表设计5 文档参考6 计算机毕设选题推荐7 源码获取 1 项目介绍 博主个人介绍&#xff1a;CSDN认证博客专家&#xff0c;CSDN平台Java领域优质…

[羊城杯 2020]Blackcat1

知识点&#xff1a;数组加密绕过 进入页面熟悉的web三部曲&#xff08;url地址&#xff0c;web源代码&#xff0c;web目录扫描&#xff09; url地址没有什么东西去看看源代码. 这有一个mp3文件点一下看看. 在最后面发现了 PHP源码. if(empty($_POST[Black-Cat-Sheriff]) || em…

Deep Learning-Based Object Pose Estimation:A Comprehensive Survey

论文&#xff1a;https://arxiv.org/pdf/2405.07801v3 项目&#xff1a;https://github.com/CNJianLiu/Awesome-Object-Pose-Estimation 年份&#xff1a;2024 方向&#xff1a;姿态估计 1. 目标姿态估计定义 估计图像中目标相对于相机的姿态&#xff0c; 目标姿态估计是增…

【网络安全】服务基础第二阶段——第五节:Linux系统管理基础----Linux常见应用服务(Apache、数据库)

在Linux系统中&#xff0c;有许多常见的应用服务&#xff0c;它们用于执行各种任务&#xff0c;如网页托管、数据库管理、文件传输等。 Apache HTTP Server&#xff1a;用于托管网站和Web应用程序的Web服务器。Nginx&#xff1a;高性能的Web服务器和反向代理服务器&#xff0c…

11Python的Pandas:可视化

Pandas本身并没有直接的可视化功能&#xff0c;但它与其他Python库&#xff08;如Matplotlib和Seaborn&#xff09;无缝集成&#xff0c;允许你快速创建各种图表和可视化。这里是一些使用Pandas数据进行可视化的常见方法&#xff1a; 1. 使用Matplotlib Pandas中的plot()方法…

YoloV10改进策略:BackBone改进|注意力改进|HCANet全局与局部的注意力模块CAFM|二次创新|即插即用

摘要 在CAFM模型的基础上进行二次创新,我成功地开发了一个性能显著提升的改进版模型。这一创新不仅优化了特征提取和融合的方式,还极大地提高了模型的泛化能力和准确性。为了验证其有效性,我们将这一改进应用于流行的目标检测算法YoloV10,并取得了显著的精度提升。这一改进…

【笔记】二维DP

文章目录 例题lanqiao1536数字三角形题目描述输入描述输出描述解题思路选取状态1代码1选取状态2代码2 lanqiao 389摆花题目描述输入描述解题思路输出描述代码 lanqiao3711选数异或题目描述输入描述输出描述解题思路 lanqiao3348可构造的序列总数 二维DP和普通DP本质相同&#x…

ios 用JXCategoryView 库实现tab滑动切换viewController

先Pod导入安装 pod JXCategoryView.m文件 // // OrderViewController.m // scxhgh2 // // Created by xmkjsoft on 2024/9/9. //#import "OrderViewController.h" #import "NavigationBarUtils.h" #import <JXCategoryView/JXCategoryView.h>#im…

《深度学习》深度学习 框架、动态展示即推导

目录 一、深度学习 1、什么是深度学习 2、特点 3、神经网络构造 1&#xff09;单层神经元 • 推导 • 示例 2&#xff09;多层神经网络 3&#xff09;小结 4、感知器 神经网络的本质 5、多层感知器 6、动态图像示例 1&#xff09;一个神经元 相当于下列状态&…

Redis入门 - C#|.NET Core封装Nuget包

经过前面章节的学习&#xff0c;可以说大家已经算Redis开发入门了。已经可以去到项目上磨砺了。 但是今天我还想和大家分享一章&#xff1a;封装自己的Redis C#库&#xff0c;然后打包成Nuget包。 首先要说明的是&#xff1a;不是要自己开发一个Redis客户端库&#xff0c;而是…

【Linux】Linux常见指令以及权限理解(下)

【Linux】Linux常见指令以及权限理解&#xff08;下&#xff09; &#x1f955;个人主页&#xff1a;开敲&#x1f349; &#x1f525;所属专栏&#xff1a;Linux&#x1f34a; &#x1f33c;文章目录&#x1f33c; 3. Linux下基本指令 3.9 mv 指令&#xff08;重点&#xff0…

借助ChatGPT撰写学术论文的10条规则

在撰写学术论文时,利用ChatGPT等人工智能工具可以显著提高写作效率和质量。以下是结合ChatGPT功能,为构建学术论文提出的10条规则,包括详细的专业说明和格式化的GPT提示词。 规则1:明确论文目标与核心问题 专业说明:确定研究的核心问题和目标是撰写论文的第一步。这有助…

如何通过可视化大屏,助力智慧城市的“城市微脑”建设?

在智慧城市的宏伟蓝图中&#xff0c;常常面临着一个关键挑战&#xff1a;如何确保这些理念和技术能够真正地惠及城市的每一个角落&#xff0c;每一个产业&#xff0c;以及每一位市民。问题的核心在于城市的具体应用场景&#xff0c;无论是横向的社区、园区、镇街、学校、酒店、…

PCB绘制

01-2-PCB的通孔、盲孔、埋孔_哔哩哔哩_bilibili 通孔&#xff1a;起点和终点肯定是最后一层和第一层 盲孔&#xff1a;起点永远是第一层&#xff08;或最后一层&#xff09;&#xff0c;终点肯定不是最后一层&#xff08;或第一层&#xff09; 埋空&#xff1a;起点和终点肯…

建筑物检测系统源码分享

建筑物检测检测系统源码分享 [一条龙教学YOLOV8标注好的数据集一键训练_70全套改进创新点发刊_Web前端展示] 1.研究背景与意义 项目参考AAAI Association for the Advancement of Artificial Intelligence 项目来源AACV Association for the Advancement of Computer Visio…

Python | Leetcode Python题解之第401题二进制手表

题目&#xff1a; 题解&#xff1a; class Solution:def readBinaryWatch(self, turnedOn: int) -> List[str]:ans list()for i in range(1024):h, m i >> 6, i & 0x3f # 用位运算取出高 4 位和低 6 位if h < 12 and m < 60 and bin(i).count("1&…

C# USB通信技术(通过LibUsbDotNet库)

文章目录 1.下载LibusbDotNet库2.引入命名空间3. 实例化USB设备4.发送数据5.关闭连接 1.下载LibusbDotNet库 右击项目选择管理NuGet程序包在弹出的界面中搜索LibusbDotNet&#xff0c;然后下载安装。 2.引入命名空间 using LibUsbDotNet; using LibUsbDotNet.Main;3. 实例化…

细数H.264 H.265 H.266区别

H.264、H.265&#xff08;HEVC&#xff09;和H.266&#xff08;VVC&#xff09;是三种不同的视频编码标准&#xff0c;它们在压缩效率、图像质量、支持的分辨率以及技术特性等方面存在显著差异。以下是对这三种编码标准的详细比较&#xff1a; 概述 H.264&#xff1a;也称为AV…

TCP全连接队列和tcpdump抓包

全连接队列 listen第二个参数 服务器在调用listen的时候&#xff0c;listen的第二个参数 1&#xff0c;就是TCP全连接队列的长度。 当客户端的连接进入established 状态后&#xff0c;如果服务器没有调用accept将连接取走&#xff0c;那么该连接就会待在TCP全连接队列中&a…

Edge浏览器设置夜间模式/深色模式

问题背景 普通白色背景感觉有点刺眼&#xff0c;想改成深色背景&#xff0c;但是默认的设置里面只能修改边框的颜色&#xff1a; 这里虽然设置界面和边框变成了黑色的&#xff0c;但是实际上打开网页还是白色的。 全局配置 在Edge浏览器打开edge://flags/&#xff0c;然后搜索D…