力扣刷题之2576.求出最多标记下标

ops/2024/11/15 6:17:18/

题干描述

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

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

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

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

示例 1:

输入:nums = [3,5,2,4]
输出:2
解释:第一次操作中,选择 i = 2 和 j = 1 ,操作可以执行的原因是 2 * nums[2] <= nums[1] ,标记下标 2 和 1 。
没有其他更多可执行的操作,所以答案为 2 。

示例 2:

输入:nums = [9,2,5,4]
输出:4
解释:第一次操作中,选择 i = 3 和 j = 0 ,操作可以执行的原因是 2 * nums[3] <= nums[0] ,标记下标 3 和 0 。
第二次操作中,选择 i = 1 和 j = 2 ,操作可以执行的原因是 2 * nums[1] <= nums[2] ,标记下标 1 和 2 。
没有其他更多可执行的操作,所以答案为 4 。

示例 3:

输入:nums = [7,6,8]
输出:0
解释:没有任何可以执行的操作,所以答案为 0 。

题干分析

题目理解

        题目给定一个整数数组nums,要求找出数组中最多可以标记的下标数目。操作条件是每次可以选择两个未标记的下标i和j,满足2 * nums[i]  <= nums[j],然后标记着两个下标。目标是执行尽可能多的标记操作。

        该题目的本质是要求我们找出符合条件的最多配对数,且配对的条件是2 * nums[i] <= nums[j],即选择较小的nums[i]和较大的nums[j]进行配对。

解题思路

1.排序数组
  • 为了便于处理每一对下标i和j,我们可以将数组nums按照肾虚排序。排序后的数组让我们能够更加轻松地选择较小的值nums[i]和较大的值nums[i],并比较是否满足条2 * nums[i] <= nums[j]。
  • 排序的时间复杂度为O(n log n)。
2.双指针法

       排序后,可以使用双指针来处理配对问题。一个指针i从数组的前半部分开始,表示较小值的位置;另一个指针j从数组的后半部分开始,表示较大值的位置。

初始化指针  

  • 指针i:从0开始,遍历前一半较小的元素
  • 指针j:从数组中间numsSize / 2喀什,遍历后一半较大的元素。

配对指针

  • 如果满足条件2 * nums[i] <= nums[j],我们可以标记着两个小标,然后移动两个指针,i指向下一个较小值,j指向下一个较大值。
  • 如果不满足条件,则移动j指向下一个更大的值,直到找到可以与i配对的值。
3.计数
  • 每次找到一个符合条件的配对时,我们将计数器count增加2,表示标记了两个下标。
  • 最后返回count即为最多可以标记的下标数目。

详细步骤

1.排序数组
  • 将数组nums进行升序排序,这样尅可以更容易找到较小值nums[i]和较大值nums[j].
  • 例如,输入nums = [9, 2, 5, 4],排序后的数组为[2,4,5,9]。
2.初始化双指针
  • i:指向数组较小的部分,初始值为0。
  • j:指向数组较大的部分,初始值为numsSize  / 2(数组中间的位置)。
  • 例如对于数组[2,4,5,9],i从0开始,j从2开始。
3.使用双指针遍历数组并配对
  • 判断2 * nums[i]  <= nums[j]是否成立。
  • 如果成立,则标记这两个下标,移动i和j。
  • 如果不成立,则只移动j,继续寻找更大的值。
4.计数并返回
  • 每找到一对符合条件的下标,计数器增加2,最后返回计数器的值。
#include <stdio.h>
#include <stdlib.h>//比较函数,用于qsort排序
int cmp(const void* a, const void* b){return (*(int*)a - *(int*)b);
}//计算最多可以标记的下标数组
int maxNumOfMarkedIndices(int* nums, int numsSize){//对数组进行升序排序qsort(nums, numsSize, sizeof(int), cmp);int i = 0;//指向较小值的指针int j = numsSize / 2;//指向较小值的指针int count = 0;//计数以标记的下标数目//使用双指针遍历数组while(i < numsSize / 2 && j < numsSize){if(2 * nums[i] <= nums[j]){//找到符合条件的配对,计数增加count += 2;i++;//移动小值指针j++;//移动大值指针}else{//如果条件不满足,移动大值指针j++;}}return count;
}

 


http://www.ppmy.cn/ops/110535.html

相关文章

MySQL——数据类型(二)

目录 一、日期与时间类型 1.1 date 1.2 datetime 1.3 timestamp 二、枚举和联合 2.1 enum 2.2 set 2.2.1 set 的插入 2.2.2 set 的查找 思维导图可以参考如下链接&#xff1a; 数据类型.xmind 夜夜亮晶晶/MySQL - Gitee.com 一、日期与时间类型 1.1 date 日期 yyy…

Gitlab备份、迁移、恢复和升级(Gitlab Backup, migration, recovery, and upgrade)

&#x1f49d;&#x1f49d;&#x1f49d;欢迎来到我的博客&#xff0c;很高兴能够在这里和您见面&#xff01;希望您在这里可以感受到一份轻松愉快的氛围&#xff0c;不仅可以获得有趣的内容和知识&#xff0c;也可以畅所欲言、分享您的想法和见解。 推荐:Linux运维老纪的首页…

vue中v-bind和v-model的区别和应用

1.区别 v-bind&#xff1a; vue2中&#xff0c;v-bind是单向数据绑定&#xff0c;用于动态绑定HTML属性和组件属性&#xff0c;只能将vue实例中的数据同步到HTML元素上&#xff0c;实现数据的动态更新和响应式渲染。v-bind的简写形式使用冒号前缀&#xff08;&#xff1a;&am…

遗传算法及其MATLAB实现

目录 引言 遗传算法的基本原理 MATLAB中遗传算法的实现 示例&#xff1a;旅行商问题&#xff08;TSP&#xff09; 表格总结&#xff1a;遗传算法求解步骤 结论 引言 遗传算法&#xff08;Genetic Algorithm&#xff0c;GA&#xff09;是一种基于自然选择和遗传机制的搜索…

速通FFmpeg入门

初识&#xff1a; ffmpeg是一款非常好用处理音视频的工具包。那什么是ffmpeg呢&#xff1f;FFmpeg是一套可以用来记录、转换数字音频、视频&#xff0c;并能将其转化为流的开源计算机程序&#xff0c;可以结合开发一些处理视频音频的功能。 安装&#xff1a; 在官网上下载安装…

appium server gui详细按照步骤

1.安装appium server desktop Appium安装提供两种方式:桌面版和命令行版。其中桌面版又分为 Appium GuI 和 Appium Desktop 。作为初学者&#xff0c;用桌面版&#xff0c;对初学者比较友好。 官网下载地址&#xff1a;Releases appium/appium-desktop GitHubTags appium/…

第七届“泰迪杯”数据分析技能赛 赛前指导安排

竞赛时间安排 报名起始时间&#xff1a; 2024年9月3日-11月7日 赛前指导时间&#xff1a; 2024年9月10日-11月7日 A 题竞赛时间&#xff1a; 2024年11月9日 8:00-20:00 &#xff08;* 8:00:00开放赛题及数据&#xff09; B 题竞赛时间&#xff1a; 2024年11月10日…

JSON.stringify()

JSON通常用于与服务端交换数据。 在向服务器发送数据时一般是字符串。 可以使用JSON.stringify()方法Javascript对象转换为字符串。 语法 JSON.stringify(value[,replacer[,space]]) 参数说明&#xff1a; 1.value&#xff1a; 必需&#xff0c;要转换的Javascript值&am…