问题描述

集合 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%的用户

最新文章

  1. Apache安装问题:configure: error: APR not found . Please read the documentation
  2. 基本概率分布Basic Concept of Probability Distributions 3: Geometric Distribution
  3. buildbot的codebaseGenerator
  4. 利用Httponly提升web应用程序安全性
  5. Uedit的快捷键
  6. Squid代理服务器&amp;&amp;搭建透明代理网关服务器
  7. QTP、LoadRunner、QC工具下载地址
  8. Tomcat Server 原理
  9. docker 容器扩盘
  10. sharedMesh变量
  11. animate动画被锁在队列中不动怎么解决
  12. 关于虚拟机打开ubuntu黑屏的问题
  13. BZOJ 3622
  14. office图标(word,powerpoint,excel)异常(变成白板)问题修复
  15. docker环境安装与开启远程访问
  16. python装饰器1:函数装饰器详解
  17. 行为型---中介者模式(Mediator Pattern)
  18. 【NOI2019模拟】搬砖
  19. How to enable mp3 on Ubuntu
  20. OSS命令行工具ossutil

热门文章

  1. 使用.NET 6开发TodoList应用(1)——系列背景
  2. MyBatis 3学习笔记
  3. CF701A Cards 题解
  4. 针对HttpClient 重写 HttpRequestRetryHandler针对特定异常 增加重试
  5. mongodb 64位操作系统下载地址
  6. jquery autocomplete 插件的使用
  7. JAVA获取请求的IP地址
  8. 【LeetCode】131. Palindrome Partitioning 解题报告(Python & C++)
  9. LeetCode 第三大的数414. Third Maximum Number
  10. anaconda 如何更换镜像源