还是应用了桶的思想,因为题中条件是不用额外的空间。把i放在nums[i - 1]的位置:首先判断nums[i]是否在它应该在的地方,即nums[i] - 1对应的位置,如果不在就交换,再把交换过来的元素放在它应该在的位置。然后重新遍历一次,发现不符合条件的元素就加入返回数组。
如果允许用额外空间的话也可以用标记数组,如果用位图的话需要考虑n的大小。
class Solution {
public List<Integer> findDisappearedNumbers(int[] nums) {
List<Integer> list=new ArrayList<>();
for(int i=0;i<nums.length;i++){
while(nums[i]!=nums[nums[i]-1]){
int tmp=nums[i];
nums[i]=nums[nums[i]-1];
nums[tmp-1]=tmp;
}
}
for(int i=0;i<nums.length;i++){
if(nums[i]!=i+1){
list.add(i+1);
}
}
return list;
}
}