leetcode 645. 错误的集合
问题描述
集合 S 包含从1到 n 的整数。不幸的是,因为数据错误,导致集合里面某一个元素复制了成了集合里面的另外一个元素的值,导致集合丢失了一个整数并且有一个元素重复。
给定一个数组 nums 代表了集合 S 发生错误后的结果。你的任务是首先寻找到重复出现的整数,再找到丢失的整数,将它们以数组的形式返回。
示例 1:
输入: nums = [1,2,2,4]
输出: [2,3]
注意:
给定数组的长度范围是 [2, 10000]。
给定的数组是无序的。
代码1
首先给出一个利用hash表空间复杂度为O(N)的算法
class Solution {
public:
vector<int> findErrorNums(vector<int>& nums) {
int n = nums.size();
map<int,int> tab;
vector<int> ans(2,-1);
for(int i = 0; i < n; i++)
tab[i+1] = 0;//注意统计的数是从[1,n]
for(int i = 0; i < n; i++)
++tab[nums[i]];//初始化hash表
for(int i = 0; i < n; i++)
{
if(tab[i+1] == 0)ans[1] = i+1;
if(tab[nums[i]] == 2)ans[0] = nums[i];
}
return ans;
}
};
结果:
执行用时 :164 ms, 在所有 C++ 提交中击败了5.60%的用户
内存消耗 :34.2 MB, 在所有 C++ 提交中击败了5.47%的用户
或者使用vector来代替map
class Solution {
public:
vector<int> findErrorNums(vector<int>& nums) {
int n = nums.size();
vector<int> tab(n,0);
vector<int> ans(2,-1);
for(int i = 0; i < n; i++)
++tab[nums[i]-1];//初始化hash表
for(int i = 0; i < n; i++)
{
if(tab[i] == 0)ans[1] = i+1;
if(tab[nums[i]-1] == 2)ans[0] = nums[i];
}
return ans;
}
};
结果:
执行用时 :32 ms, 在所有 C++ 提交中击败了89.26%的用户
内存消耗 :23.2 MB, 在所有 C++ 提交中击败了5.47%的用户
代码2
再给出一个空间复杂度为O(1)的算法,以题目中例子为例:
我们第一遍遍历尝试将所有nums[i]-1所对应的 nums[abs(nums[i]-1)]变为负数,以表示该数已经存在了,如果nums[abs(nums[i]-1)]<0,代表元素nums[i]重复了。,遍历完以后,只有一个索引所对应的nums[i]为正的,这个索引就是缺失的值。
class Solution {
public:
vector<int> findErrorNums(vector<int>& nums) {
int n = nums.size();
vector<int> ans(2,-1);
for(int i = 0; i < n; i++)
{
int index = abs(nums[i]) - 1;
if(nums[index] < 0)ans[0] = fabs(nums[i]);
else nums[index] *= -1;
}
for(int i = 0; i < n; i++)
{
if(nums[i] > 0)ans[1] = i+1;
}
return ans;
}
};
结果:
执行用时 :36 ms, 在所有 C++ 提交中击败了73.22%的用户
内存消耗 :22.7 MB, 在所有 C++ 提交中击败了5.47%的用户
leetcode 645. 错误的集合的更多相关文章
- Java实现 LeetCode 645 错误的集合(暴力)
645. 错误的集合 集合 S 包含从1到 n 的整数.不幸的是,因为数据错误,导致集合里面某一个元素复制了成了集合里面的另外一个元素的值,导致集合丢失了一个整数并且有一个元素重复. 给定一个数组 n ...
- 领扣(LeetCode)错误的集合 个人题解
集合 S 包含从1到 n 的整数.不幸的是,因为数据错误,导致集合里面某一个元素复制了成了集合里面的另外一个元素的值,导致集合丢失了一个整数并且有一个元素重复. 给定一个数组 nums 代表了集合 S ...
- LeetCode 645. Set Mismatch (集合不匹配)
The set S originally contains numbers from 1 to n. But unfortunately, due to the data error, one of ...
- [Swift]LeetCode645. 错误的集合 | Set Mismatch
The set S originally contains numbers from 1 to n. But unfortunately, due to the data error, one of ...
- [LeetCode] 78. Subsets 子集合
Given a set of distinct integers, S, return all possible subsets. Note: Elements in a subset must be ...
- pycharm链接数据库以及连接时候出现错误的集合
1.pycharm如何直接连接数据库? 作用:这是一种管理数据库的方式而已,因为在开发过程中结合使用还是不错的!当然,还有有很多管理数据库的工具和方法. 比如:navicat工具 1.1 如何找到管 ...
- Leetcode645.Set Mismatch错误的集合
集合 S 包含从1到 n 的整数.不幸的是,因为数据错误,导致集合里面某一个元素复制了成了集合里面的另外一个元素的值,导致集合丢失了一个整数并且有一个元素重复. 给定一个数组 nums 代表了集合 S ...
- IIS错误处理集合
1.编译器错误消息: CS0016: 未能写入输出文件“c:\Windows\Microsoft.NET\Framework\v2.0.50727\Temporary ASP.NET Files\ya ...
- PHP中错误处理集合
PHP错误处理 错误的分类 通常分3种: 语法错误: 程序运行之前,都要先检查语法.如果语法有错误,就会立即报错,并且不会去执行程序. 运行时错误: 就是在程序语法检查通过后,,开始运行程序并在此过程 ...
随机推荐
- 大型网站高可用架构之CAP原理
在讨论高可用数据服务架构之前,必须先讨论的一个话题是,为了保证数据的高可用,网站通常会牺牲另一个也很重要的指标:数据一致性. CAP原理认为,一个提供数据服务的存储系统无法同时满足数据一致性.数据可用 ...
- [C# Expression] 之基础概念
00 | 什么是表达式树 表达式树以树形数据结构表示代码,其中每一个节点都是一种表达式,比如方法调用和 x < y 这样的二元运算等.可以对表达式树中的代码进行编辑和运算. 这样能够动态修改可执 ...
- Linux 主从数据库
主从数据库 主数据库的内容同步传输到附属数据库 客户访问附属数据库 这样做保证了数据库的稳定性 需要两台虚拟机 两边个虚拟机都要操作 配置hosts文件 进入/etc/hosts追加输入 192.16 ...
- 二叉树c++实现
!!版权声明:本文为博主原创文章,版权归原文作者和博客园共有,谢绝任何形式的 转载!! 作者:mohist --- 欢迎指正--- 二叉树特点: 要么为空树:要么,当前结点的左孩子比当前结点值小,当前 ...
- Redis的各种实现(Jedis、Redisson、Lettuce)
1.1.Jedis 是Redis的Java实现的客户端.支持基本的数据类型如:String.Hash.List.Set.Sorted Set. 特点:使用阻塞的I/O,方法调用同步,程序流需要等到so ...
- 【LeetCode】剑指 Offer 04. 二维数组中的查找
二维数组查找:线性查找法 有二维数组: [ [1, 4, 7, 11, 15], [2, 5, 8, 12, 19], [3, 6, 9, 16, 22], [10, 13, ...
- Spring Boot实战三:集成RabbitMQ,实现消息确认
Spring Boot集成RabbitMQ相比于Spring集成RabbitMQ简单很多,有兴趣了解Spring集成RabbitMQ的同学可以看我之前的<RabbitMQ学习笔记>系列的博 ...
- Adversarial Defense by Restricting the Hidden Space of Deep Neural Networks
目录 概 主要内容 Mustafa A., Khan S., Hayat M., Goecke R., Shen J., Shao L., Adversarial Defense by Restric ...
- 取代 Maven?这款项目构建工具性能提升 300%
在 GitHub 上闲逛的时候,发现了一个新的项目:maven-mvnd,持续霸占 GitHub trending 榜单好几天了. maven-mvnd,可以读作 Maven Daemon,译作 Ma ...
- CS5212 pin to pin 替代RTD2166|DP转VGA芯片|CS5212转换电路设计方法
CS5212适用于设计DP转VGA转换电路,主要用在嵌入式单片机基于工业机或者INTEL X86主板上面,也适用于多个电子配件市场和显示器应用程序,如笔记本电脑.主板.台式机.适配器.转换器和转接器. ...