LeetCode试手:寻找缺失的数字
题目
给定一个范围在 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%的小伙伴。