给定一个范围在 1 ≤ a[i] ≤ n ( n = 数组大小 ) 的 整型数组,数组中的元素一些出现了两次,另一些只出现一次。
找到所有在 [1, n] 范围之间没有出现在数组中的数字。
您能在不使用额外空间且时间复杂度为O(n)的情况下完成这个任务吗? 你可以假定返回的数组不算在额外空间内。
示例:
输入:
[4,3,2,7,8,2,3,1]
输出:
[5,6]
思路:
归位法,将各数字放于他应有的次序,之后遍历数组,每个位置上的数字与原本应有的数字不对应,即数字i+1不存在
例如:2 3 5 1 2
第一次遍历:2应该放在第二个位置,-> 3 2 5 1 2
还在i=0位置处,发现3也不在应该的位置 -> 5 2 3 1 2
哎?5也不在 ->2 2 3 1 5
虽然第一个2不应该放在i=0处,但i=1处已经有2,所以不交换,进行第二次遍历
第二次遍历:第二个2已经归位
第三次遍历:3已经归位
第四次遍历:1不在本来的位置 ->1 2 3 2 5
第五次遍历:5已经归位
之后遍历数组,发现i=3处本来应该是4,现在没有,4就是消失的数字
提交的代码:
class Solution {
public List<Integer> findDisappearedNumbers(int[] nums) {
List<Integer> list = new ArrayList<Integer>();
for(int i=0;i<nums.length;i++)
{
while(nums[i]!=nums[nums[i]-1]) //不可写为if,因为交换之后,i处可能还不是本来应该有的数字,具体看上面的例子
{
int t = nums[nums[i]-1];
nums[nums[i]-1] = nums[i];
nums[i] = t;
}
}
for(int i=0;i<nums.length;i++)
{
if(nums[i]!=(i+1))
{
list.add(i+1);
}
}
return list;
}
}