时间复杂度O(n),空间复杂度O(1)
public List<Integer> findDisappearedNumbers(int[]nums){
int n = nums.length;
for(int num : nums){
int x= (num-1)%n; //对n取模来还原出它本来的值
nums[x]+=n;
}
List<Integer> result = new ArrayList<Integer>();
for(int i=0;i<n;i++){
if(nums[i]<=n){
result.add(i+1);
}
}
return result;
}
解析
原数组[4,3,2,7,8,2,3,1]
第一个for循环如下:
1.x=(4-1)%8=3; nums[3]=7+8=15;
2.x=(3-1)%8=2; nums[2]=2+8=10;
3.x=(2-1)%8=1; nums[1]=3+8=11;
4.x=(7-1)%8=6; nums[6]=3+8=11;
5.x=(8-1)%8=7; nums[7]=1+8=9;
6.x=(2-1)%8=1; nums[1]=3+8=11;
7.x=(3-1)%8=2; nums[2]=2+8=10;
8..x=(1-1)%8=0; nums[0]=4+8=12;
第一个for循环遍历完之后发现
出现的下标为[3,2,1,6,7,1,2,0]
元素不消失得到的下标应该为[0,1,2,3,4,5,6,7]
所以缺了[4,5]
然后将下标加1,得到[5,6] ,就跟示例一结果一样