【Leetcode】2007. 从双倍数组中还原原数组

embedded/2024/10/18 22:30:01/

题目描述

题目链接
一个整数数组original可以转变成一个双倍数组changed,转变方式为将original中每个元素值乘以2加入数组中,然后将所有元素随机打乱

给你一个数组changed,如果change双倍数组,那么请你返回original数组,否则请返回空数组。original的元素可以以任意顺序返回。

题目分析

这题难点在于随机打乱,并且我们要根据一个元素去找另一个元素(二倍值)。我们可以对整个changed进行排序,这样第一个元素肯定就不是二倍值,我们想判断它的二倍值是否存在,最简单粗暴的方法就是往后遍历,但是这样做效率肯定就很低,那么我们能想到一个查询为O(1)的方法——把他们用map保存起来,其中key是该元素值,value是这个元素出现的次数。

为什么要统计出现次数?我们判断某一个元素changed[i]的二倍值是否存在,即其二倍值出现的次数map[2*changed[i]]是否不为0。若存在,则将该元素放入original中,并且将它的二倍值减1,因为我们不希望往后遍历的时候再去碰到这个二倍值,同时,因为这个元素已经被我们放进original了,该元素出现的次数也要减1

cpp代码

于是我们可以写出下面的代码:

class Solution {
public:vector<int> findOriginalArray(vector<int>& changed) {// 如果changed的元素个数不是2的倍数,则一定不是双倍数组if(!changed.size() % 2) return {};sort(changed.begin(), changed.end());  // 首先将changed排序unordered_map<int, int> map; // 利用map来记录每一个元素出现的次数for(int i : changed) {map[i]++;   // 元素作为key,出现次数为value}vector<int> original;for(int j : changed) {if(map[j] != 0) {if((j && map[j * 2] != 0) || (!j && map[j] > 1)) {    // 如果2*j在map中出现过,则说明有配对map[j * 2]--;original.push_back(j);map[j]--;   //j出现次数也要-1,因为我们拿出了一个放进了original}else return{};}else continue;}return original;}
}; 

需要注意的是,我对元素值为0的进行了单独的判断,也就是if语句中的:j && map[j] > 1。因为0的二倍值就是它自己,所以他的二倍值出现次数和本身出现次数都存放在mapkey0value中。


http://www.ppmy.cn/embedded/8959.html

相关文章

IDEA 2021.3.3最新激活破解教程(可激活至2099年,亲测有效)

1、ja-netfilter-all Windows 系统&#xff0c;点击运行 install-current-user.vbs 脚本&#xff0c;为当前用户安装破解补丁 截图是window环境下的激活方式 运行此补丁大约花费几分钟&#xff0c;点击 确定&#xff0c; 等待 Done 完成提示框出现&#xff0c;到这里&#xf…

基于Spring Cloud Alibaba的微服务业务拆分设计

胡弦&#xff0c;视频号2023年度优秀创作者&#xff0c;互联网大厂P8技术专家&#xff0c;Spring Cloud Alibaba微服务架构实战派(上下册)和RocketMQ消息中间件实战派(上下册)的作者&#xff0c;资深架构师&#xff0c;技术负责人&#xff0c;极客时间训练营讲师&#xff0c;四…

49.基于SpringBoot + Vue实现的前后端分离-爱心公益网站系统(项目 + 论文)

项目介绍 本站是一个B/S模式系统&#xff0c;采用SpringBoot Vue框架&#xff0c;MYSQL数据库设计开发&#xff0c;充分保证系统的稳定性。系统具有界面清晰、操作简单&#xff0c;功能齐全的特点&#xff0c;使得基于SpringBoot Vue技术的爱心公益网站系统设计与实现管理工作…

一款批量Poc漏洞扫描工具

POC bomber漏洞扫描工具&#xff0c;可以快速的扫描站点是否存在已知的漏洞。如任意文件上传、反序列化、Sql注入等高危漏洞等&#xff0c;方便安全测试人员进行安全检测及维护。POC bomber是一款漏洞检测/利用工具&#xff0c;旨在利用大量高危害漏洞的POC/EXP快速获取目标服务…

Docker基本管理

docker前言 云端 云端是一款采用应用程序虚拟化技术&#xff08;Application Virtualization&#xff09;的软件平台 华为云 谷歌云 腾讯云 阿里云 亚马逊 百度云 移动云 天翼云 西部数码云等 国内云&#xff1a; 华为云 阿里云 腾讯云 天翼云&#xff08;私有云&#xff09…

线程互斥及基于线程锁的抢票程序

我们实现一个简单的多线程抢票程序。 #include<iostream> #include<thread> #include<unistd.h> #include<functional> #include<vector> using namespace std; template<class T> using func_tfunction<void(T)>;//返回值为void,…

FreeLearning PHP 译文集翻译完成

使用 PHP 和 jQuery 构建游戏化 Web 站点使用 PHP7 构建 REST Web 服务PHP 入门指南CouchDB 和 PHP Web 开发初学者指南Vue2 和 Laravel5 全栈开发函数式 PHPAngular6 和 Laravel5 Web 全栈开发实用指南FuelPHP 高效开发学习手册PHP 数据对象学习手册PHP7 高性能开发学习手册La…

MySQL--创建,删除,查找,案例

1.数据库的---创建&#xff0c;删除&#xff0c;查找&#xff0c;案例 create database 数据库名称; # 创建一个数据库&#xff0c;所有参数默认 create database 数据库名称 [default chasetutf8mb4] # 创建的同时指定了编码2.drop删除 drop database 数据库名称;3.进入数据库…