描述

Given an array of integers where 1 ≤ a[i] ≤ n (n = size of array), some elements appear twice and others appear once.

Find all the elements of [1, n] inclusive that do not appear in this array.

Could you do it without extra space and in O(n) runtime? You may assume the returned list does not count as extra space.

Example:

Input:

[4,3,2,7,8,2,3,1]

Output:

[5,6]

分析

这道题要是先排序,再计算,就会十分简单,然而平均性能最好的快排也只有O(nlgn),明显不符合题目要求。

一开始想了挺久都没解出来,后来看了讨论区 https://discuss.leetcode.com/topic/65944/c-solution-o-1-space

的答案才知道的。

这种解法还是挺巧妙的,我怎么就想不到呢。。。还是做的题目太少了啊。。

解法如下

由于数组大小是n,且元素值范围为[1,n],因此可以从下标和元素值大小的联系入手。

遍历该数组,对于每一个元素,都将对应的元素置为负数,如对于题目所给数组,第一个元素为4,则将第四个元素7(对应的数组的下标为3)置为负数,如果是负数,则不作处理。遍历结束后,数组元素 变为:

[-4,-3,-2,-7,8,2,-3,-1]

第5个元素8需要下标为4的元素来将其置为负数,由于数组中没有5这个元素,因此该元素值仍为正数8,同理,第6个元素(对应的下标为5)也是正数。

因此,只需要再遍历一次数组,每遇到一个正数,就说明对应的元素不在数组中,将该元素压入vector中,遍历结束后,即可得到结果。

代码如下:

class Solution {
public:
vector<int> findDisappearedNumbers(vector<int>& nums) {
if(nums.size() == 0)return nums;
vector<int>ret;
for(int i = 0; i != nums.size(); ++i){
int m = abs(nums[i]) - 1;
nums[m] = nums[m] > 0 ? -nums[m] : nums[m];
}
for(int i = 0; i != nums.size(); ++i){
if(nums[i] > 0)ret.push_back(i + 1);
}
return ret;
}
};

最新文章

  1. Lesson 14 Do you speak English?
  2. Html页面禁止鼠标左键复制
  3. 【CMD】
  4. 【模式匹配】更快的Boyer-Moore算法
  5. NSURLConnection获取一个MP3文件
  6. getBoundingClientRect在IE9/10里的bug
  7. 一个WebService Demo
  8. 如何写出优秀的研究论文 Chapter 1. How to Write an A+ Research Paper
  9. Apache httpd开启SSL
  10. SQL Server Cpu 100% 的常见原因及优化
  11. C#操作Word文档(加密、解密、对应书签插入分页符)
  12. 使用zabbix监控mysql的三种方式
  13. bzoj 3594: [Scoi2014]方伯伯的玉米田
  14. Andrew Ng机器学习课程笔记--week3(逻辑回归&amp;正则化参数)
  15. 内核对象 windows操作系统
  16. 微信app支付(android端+java后台)
  17. brew install
  18. 分享一个不错的Unittest测试报告
  19. C语言 统计一串字符中空格键、Tab键、回车键、字母、数字及其他字符的个数(Ctrl+Z终止输入)
  20. 第七章 鼠标(CHECKER1)

热门文章

  1. yii2 发送邮件 yii\swiftmailer\Mailer
  2. vue 项目中assets 和static的区别
  3. 使用 SetParent 跨进程设置父子窗口时的一些问题(小心卡死)
  4. 2.7_Database Interface OLE-DB诞生
  5. NEST analyze与mapping
  6. 修改CentOS默认yum源为国内镜像
  7. 有关mysql的utf8和utf8mb4,以及Illegal mix of collations for operation &#39;like&#39;
  8. JavaScript中匿名函数this指向问题
  9. [转]关于ORA-00979 不是 GROUP BY 表达式错误的解释
  10. jenkens docker启动