首页 > 技术文章 > LeetCode试手:寻找缺失的数字

huasheng2020 2021-02-14 10:09 原文

题目

给定一个范围在  1 ≤ a[i] ≤ n ( n = 数组大小 ) 的 整型数组,数组中的元素一些出现了两次,另一些只出现一次。
找到所有在 [1, n] 范围之间没有出现在数组中的数字。
您能在不使用额外空间且时间复杂度为O(n)的情况下完成这个任务吗? 你可以假定返回的数组不算在额外空间内。
来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/find-all-numbers-disappeared-in-an-array
著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。

思路1:

首先尝试利用hashset的不重复规则,生成一个hashset 1-n,遍历一边数组,存在的remove;

再把hashset加到返回的ArrayList中;

击败 12.36%,占用额外空间。

思路2:研究官方思路:

  * 利用nums这个数组自带的序数来标记这个数字有没有出现过,
         * 1. 遍历从0到size序数的nums
         * 2. 假如第n序数的数字3出现了,那么把序数为3(3-1)的数字x改为-x;
         * 3. 假如发现第n序数的数字x为负,那说明这个位置被改动过了,以后不再改动序数为n的数字;
         * 4. 但是需要改动序数为n的负数字对应的那个序数的值,即它所指的值*/

结果:

 

仅是击败50%!

 

总结和感悟:

处理数组很容易数组越界,践行了多个危险操作,但是好处是快!

hashset没有越界的风险,好处是实现快,然而是运行速度慢。

不过也看到了自己和编程高手的差距。

理解半天也仅是击败50%的小伙伴。

 

推荐阅读