力扣每日一题——数组能够形成多少对

目录

题目链接:2341. 数组能形成多少数对 - 力扣(LeetCode)

题目描述

解法一:List集合

Java写法:

运行时间

C++写法:

 

解法二:Set集合

Java写法:

运行时间

C++写法

上述两种方法的时间复杂度和空间复杂度

空间复杂度

总结

解法三:Map集合(最清晰的写法)

Java写法:

运行时间

C++写法

总结

题目描述

解法一:List 集合

解法二:Set 集合

解法三:Map 集合

总结


题目链接:2341. 数组能形成多少数对 - 力扣(LeetCode)

注:下述题目描述和示例均来自力扣

题目描述

给你一个下标从 0 开始的整数数组 nums 。在一步操作中,你可以执行以下步骤:

  • 从 nums 选出 两个 相等的 整数
  • 从 nums 中移除这两个整数,形成一个 数对

请你在 nums 上多次执行此操作直到无法继续执行。

返回一个下标从 0 开始、长度为 2 的整数数组 answer 作为答案,其中 answer[0] 是形成的数对数目,answer[1] 是对 nums 尽可能执行上述操作后剩下的整数数目。

示例 1:

输入:nums = [1,3,2,1,3,2,2]
输出:[3,1]
解释:
nums[0] 和 nums[3] 形成一个数对,并从 nums 中移除,nums = [3,2,3,2,2] 。
nums[0] 和 nums[2] 形成一个数对,并从 nums 中移除,nums = [2,2,2] 。
nums[0] 和 nums[1] 形成一个数对,并从 nums 中移除,nums = [2] 。
无法形成更多数对。总共形成 3 个数对,nums 中剩下 1 个数字。

示例 2:

输入:nums = [1,1]
输出:[1,0]
解释:nums[0] 和 nums[1] 形成一个数对,并从 nums 中移除,nums = [] 。
无法形成更多数对。总共形成 1 个数对,nums 中剩下 0 个数字。

示例 3:

输入:nums = [0]
输出:[0,1]
解释:无法形成数对,nums 中剩下 1 个数字。

提示:

  • 1 <= nums.length <= 100
  • 0 <= nums[i] <= 100


解法一:List集合

  • 初始化数据结构:使用一个 List<String> 作为存储结构,set 用于记录当前未配对的元素。count 用于统计配对的数量。

  • 遍历数组:通过增强的 for 循环遍历输入数组 nums 中的每个元素。

  • 判断配对

    • 对于每个元素,将其转换为字符串,并检查 set 中是否已存在该字符串。
    • 如果存在,说明找到了一个配对,此时从 set 中移除该元素,并将 count 增加 1。
    • 如果不存在,则将该元素的字符串形式添加到 set 中,表示该元素未配对。
  • 返回结果:最后,返回一个整数数组,其中第一个元素是配对的数量 count,第二个元素是 set 的大小,代表未配对的元素数量。

Java写法:

class Solution {public int[] numberOfPairs(int[] nums) {List<String> set = new ArrayList<>();int count = 0;for (int i : nums) {if (set.contains(Integer.toString(i))) {set.remove(Integer.toString(i));count++;} else {set.add(Integer.toString(i));}}return new int[]{count, set.size()};}
}

运行时间

C++写法:

 

#include <vector>
#include <unordered_set>
#include <string>class Solution {
public:std::vector<int> numberOfPairs(std::vector<int>& nums) {std::unordered_set<int> set; // 使用哈希集来存储未配对的元素int count = 0;for (int num : nums) {if (set.find(num) != set.end()) {set.erase(num); // 找到配对,移除该元素count++;} else {set.insert(num); // 未找到配对,添加该元素}}return {count, static_cast<int>(set.size())}; // 返回配对数量和未配对元素数量}
};

 


解法二:Set集合

        这个方法和List集合的实现思路一模一样,只是实现方式不同而已,所以我就不再做过多的介绍了。

Java写法:

class Solution {public int[] numberOfPairs(int[] nums) {Set<Integer> set = new HashSet<>();int count = 0;for (int i : nums) {if (set.contains(i)) {set.remove(i);count++;} else {set.add(i);}}return new int[]{count, set.size()};}
}

运行时间

C++写法

#include <vector>
#include <unordered_set>class Solution {
public:std::vector<int> numberOfPairs(std::vector<int>& nums) {std::unordered_set<int> set; // 使用哈希集来存储未配对的元素int count = 0;for (int num : nums) {if (set.find(num) != set.end()) {set.erase(num); // 找到配对,移除该元素count++;} else {set.insert(num); // 未找到配对,添加该元素}}return {count, static_cast<int>(set.size())}; // 返回配对数量和未配对元素数量}
};

 


上述两种方法的时间复杂度和空间复杂度

  1. 遍历数组:代码中使用一个 for 循环遍历输入数组 nums,这个过程的时间复杂度是 O(n),其中 n 是数组的长度。

  2. 集合操作

    • set.contains(Integer.toString(i)):在使用 List 的情况下,查找一个元素的时间复杂度是 O(m),其中 m 是列表的当前大小。最坏情况下,当所有元素都不同时,m 会接近 n,因此查找操作可能达到 O(n)。
    • set.remove(Integer.toString(i))set.add(Integer.toString(i)):在列表中,移除和添加元素的时间复杂度也是 O(m)。

        综上所述,使用后list方法,由于在每次循环中都涉及到 containsremoveadd 操作,每次的操作时间都是 O(n),因此整体的时间复杂度为 O(n^2)。

空间复杂度

  1. 存储结构:使用了一个 List<String> 来存储未配对的元素。在最坏情况下,如果所有元素都不同,set 的大小将达到 n,因此空间复杂度为 O(n)。

总结

  • 时间复杂度:O(n^2) — 由于每个元素的查找、添加和移除操作都在列表中进行,导致在最坏情况下时间复杂度为 O(n^2)。
  • 空间复杂度:O(n) — 存储未配对的元素,在最坏情况下可能需要存储 n 个不同的元素。

        这种实现虽然思路清晰,但在效率上不够高,特别是对于较大的输入数组。如果使用 HashSet 替代 List,则时间复杂度可以优化为 O(n),空间复杂度仍为 O(n)。


解法三:Map集合(最清晰的写法)

  • HashMap:使用 HashMap<Integer, Integer> 来存储每个整数及其出现次数。

  • 计数:通过遍历 nums 数组,更新哈希表,使用 getOrDefault 方法来简化计数过程。

  • 计算配对数和剩余数

    • 遍历哈希表中的值,计算配对数(每一对由两个数构成)和剩余数(对 2 取余)。
  • 返回结果:返回一个整数数组,数组的第一个元素是配对的数量,第二个元素是剩余的整数数量。

Java写法:

class Solution {public int[] numberOfPairs(int[] nums) {HashMap<Integer, Integer> countMap = new HashMap<>();// 计数每个整数的出现次数for (int num : nums) {countMap.put(num, countMap.getOrDefault(num, 0) + 1);}int pairs = 0;int remaining = 0;// 计算配对数和剩余数for (int count : countMap.values()) {pairs += count / 2;          // 每一对由两个相同的数构成remaining += count % 2;      // 剩余未配对的数}return new int[]{pairs, remaining};}
}

运行时间

C++写法

#include <vector>
#include <unordered_map>class Solution {
public:std::vector<int> numberOfPairs(std::vector<int>& nums) {std::unordered_map<int, int> countMap; // 哈希表存储每个整数及其出现次数// 计数每个整数的出现次数for (int num : nums) {countMap[num]++;}int pairs = 0;int remaining = 0;// 计算配对数和剩余数for (const auto& entry : countMap) {pairs += entry.second / 2;         // 每一对由两个相同的数构成remaining += entry.second % 2;     // 剩余未配对的数}return {pairs, remaining}; // 返回配对数量和剩余整数数量}
};

总结

题目描述

  • 输入一个下标从 0 开始的整数数组 nums
  • 可以从中选出两个相等的整数,形成一个数对并移除。
  • 返回一个长度为 2 的整数数组,其中 answer[0] 是形成的数对数目,answer[1] 是剩下的整数数目。

解法一:List 集合

  • 使用 ArrayList 存储未配对的元素,通过字符串形式进行查找。
  • 由于查找操作时间复杂度为 O(n),整体复杂度为 O(n²)。

解法二:Set 集合

  • 使用 HashSet 存储未配对的元素,查找、添加和移除操作的平均时间复杂度为 O(1)。
  • 时间复杂度优化为 O(n),空间复杂度为 O(n)。

解法三:Map 集合

  • 使用 HashMap 统计每个整数的出现次数。
  • 遍历哈希表计算配对数和剩余数。
  • 时间复杂度为 O(n),空间复杂度为 O(n),是较清晰且高效的解法。

总结

  • 不同的数据结构影响算法的效率。
  • 使用 HashSetHashMap 比使用 ArrayList 更能提高性能,尤其在大数据量时。

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

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

相关文章

开源项目-投票管理系统

哈喽,大家好,今天主要给大家带来一个开源项目-投票管理系统 投票管理系统主要有首页,发起投票,管理投票,参与投票,查看投票等功能 首页 为用户提供了一键导航到各个功能模块的便捷途径。 新增投票 用户可以在此轻松创建新的投票活动,设置投票主题、选项等信息。 管理…

高级java每日一道面试题-2024年10月27日-Redis篇-jedis和redisson有哪些区别?

如果有遗漏,评论区告诉我进行补充 面试官: jedis和redisson有哪些区别? 我回答: 在Java高级面试中&#xff0c;Jedis和Redisson的区别是一个常见且重要的话题。以下是对这两个Java客户端库的详细对比&#xff1a; 设计思想与实现方式 Jedis&#xff1a; 设计思想&#xff…

[Python]K小姐经营着一家蛋糕店,她的蛋糕店有 n 种口味的蛋糕。这 n 种口味的蛋糕在 A 工厂和 B 工厂都有生产。

问题来源&#xff1a;【秋招突围】2024届秋招-京东笔试题-第三套_牛客网 问题描述 K小姐经营着一家蛋糕店&#xff0c;她的蛋糕店有 n种口味的蛋糕。这 n 种口味的蛋糕在 A 工厂和 B 工厂都有生产。 对于每种口味的蛋糕&#xff0c;如果 A 工厂生产的口感值为 AiA_iAi​&…

设计模式讲解01-建造者模式(Builder)

1. 概述 建造者模式也称为&#xff1a;生成器模式 定义&#xff1a;建造者模式是一种创建型设计模式&#xff0c;它允许你将创建复杂对象的步骤与表示方式相分离。 解释&#xff1a;建造者模式就是将复杂对象的创建过程拆分成多个简单对象的创建过程&#xff0c;并将这些简单…

【Python ASR 】模型对比 whisper 和 funasr

【Python ASR 】模型对比 模型差异比较大的几段结果最后相关网站 模型 Paraformer-zh&#xff08;离线免费-推荐&#xff09; 语音识别&#xff0c;带时间戳输出&#xff0c;非实时 SenseVoiceSmall&#xff08;离线免费&#xff09; 多种语音理解能力&#xff0c;涵盖了自动语…

Python爬虫抓取三个网站上的英语每日一句

一、引言 大学英语学习需要巩固高中语法&#xff0c;补充四六级词汇&#xff0c;增加英语语感&#xff0c;提升英语的运用能力。学好英语有很多种方法&#xff0c;采用句子来突破英语语法、词汇、口语和听力的方法简单有效&#xff0c;值得提倡。李阳就是采用这种方法来教授英…

PostgreSQL 学习笔记:PostgreSQL 主从复制

PostgreSQL 笔记&#xff1a;PostgreSQL 主从复制 博客地址&#xff1a;TMDOG 的博客 在现代应用程序中&#xff0c;数据库的高可用性和扩展性是至关重要的。PostgreSQL 提供了主从复制功能&#xff0c;可以在多个数据库实例之间复制数据&#xff0c;以实现冗余和负载均衡。本…

[云讷科技]DASA数字孪生机器人概念

DASA数字孪生机器人概念 我们在 虚幻引擎 (UE) 的帮助下在 DASA 中建立了数字孪生机器人概念。 UE 是 Epic Games 开发的 3D 计算机图形游戏引擎&#xff0c;广泛应用于视频游戏、电影和电视。我们在 DASA 中利用强大的 UE 功能来实现外观逼真的数字机器人&#xff0c;并允许与…

探索Python新境界:Buzhug库的神秘面纱

文章目录 探索Python新境界&#xff1a;Buzhug库的神秘面纱第一部分&#xff1a;背景介绍第二部分&#xff1a;Buzhug库是什么&#xff1f;第三部分&#xff1a;如何安装Buzhug库&#xff1f;第四部分&#xff1a;Buzhug库函数使用方法第五部分&#xff1a;Buzhug库使用场景第六…

微信小程序的上拉刷新与下拉刷新

效果图如下&#xff1a; 上拉刷新 与 下拉刷新 代码如下&#xff1a; joked.wxml <scroll-view class"scroll" scroll-y refresher-enabled refresher-default-style"white" bindrefresherrefresh"onRefresh" refresher-triggered&qu…

Java唯一键实现方案

数据唯一性 1、生成UUID1.1 代码中实现1.2 数据库中实现优点缺点 2、数据库递增主键优点 3、数据库递增序列3.1 创建序列3.2 使用序列优点缺点 在Java项目开发中&#xff0c;对数据的唯一性要求&#xff0c;业务数据入库的时候保持单表只有一条记录&#xff0c;因此对记录中要求…

《向量数据库指南》——BGE-M3:引领多模态RAG系统新风尚!

BGE-M3 BGE-M3 是一个多功能的 Embedding 模型,能够处理多种语言的文本,并支持不同的粒度级别。例如,您可以处理短句,也可以处理长达 8192 个 Token 的长文档。这个 Embedding 模型还能够输出两种不同的向量类型:稠密向量(Dense embedding)和稀疏向量(Sparse embeddin…

在Ubuntu上安装TensorFlow与Keras

文章目录 1. 查看系统和Python版本信息1.1 查看Ubuntu版本信息1.2 查看Python版本信息 2. 安装pip2.1 下载get-pip.py2.2 运行get-pip.py2.3 查看pip版本 3. 安装Jupyter Notebook3.1 安装Jupyter Notebook3.2 运行Jupyter Notebook3.3 安装jupyter-core3.4 配置Jupyter Notebo…

kubesphere jenkins自动重定向 http://ks-apiserver:30880/oauth/authorize

问题&#xff1a;登陆kubesphere的jenkins Nodeport IP :Port 46.XXX.XXX.16:30180 自动跳转失败 http://ks-apiserver:30880/oauth/authorize?client_idjenkins&redirect_urihttp://46.XXX.XXX.16:30180/securityRealm/finishLogin&response_typecode&scopeopen…

江协科技STM32学习- P34 I2C通信外设

&#x1f680;write in front&#x1f680; &#x1f50e;大家好&#xff0c;我是黄桃罐头&#xff0c;希望你看完之后&#xff0c;能对你有所帮助&#xff0c;不足请指正&#xff01;共同学习交流 &#x1f381;欢迎各位→点赞&#x1f44d; 收藏⭐️ 留言&#x1f4dd;​…

系统地介绍Qt的QtConcurrent模块

本文使用了AI生成的内容&#xff0c;请注意甄别&#xff01; 本文系统地介绍Qt的QtConcurrent模块&#xff0c;它允许开发者无需使用低级线程原语&#xff08;如互斥锁、读写锁、等待条件或信号量&#xff09;即可编写多线程程序。下面将由浅入深地逐步介绍这一内容&#xff1a…

ctfshow(91,96,97)--PHP特性

Web91 源代码&#xff1a; show_source(__FILE__); include(flag.php); $a$_GET[cmd]; if(preg_match(/^php$/im, $a)){if(preg_match(/^php$/i, $a)){echo hacker;}else{echo $flag;} } else{echo nonononono; }Notice: Undefined index: cmd in /var/www/html/index.php on…

大学生软件测试2024(练习赛)

本人不太会java语法&#xff0c;主要是本专业老师主讲java&#xff0c;所以不得不使用java语言进行编写&#xff0c;不当之处请见谅&#xff01; 背景说一哈&#xff0c;有点摸鱼的成分&#xff0c;主要是期末课设和这个有关&#xff0c;想学着看看&#xff0c;不知道能不能得…

【Arch Linux 上安装 Appium 】

安装 Node.js 和 npm sudo pacman -S nodejs npm安装 Appium sudo npm install -g appium安装 Appium Doctor&#xff08;可选&#xff09; # Appium Doctor 是一个工具&#xff0c;用于检查你的系统是否满足 Appium 运行所需的所有依赖项 sudo npm install -g appium-docto…

研究了100个小绿书十万加之后,我们发现2024小绿书独家秘籍就是:在于“先抄后超,持续出摊,量大管饱”!

小绿书作为今年最大的红利&#xff0c;很多人已经吃到了螃蟹。看——&#xff1a; 今天我们总结了100个10万爆款&#xff0c;我们发现要在这个平台上脱颖而出&#xff0c;找到属于自己的方法尤为重要。在这里分享一个主题——小绿书的秘诀就是“先抄后超&#xff0c;持续出摊”…