题目:
给你一个含 n 个整数的数组 nums ,其中 nums[i] 在区间 [1, n] 内。请你找出所有在 [1, n] 范围内但没有出现在 nums 中的数字,并以数组的形式返回结果。
示例:
输入:nums = [4,3,2,7,8,2,3,1] 输出:[5,6]
思路:
思路是两遍遍历,第一遍排序,将值放到对应的位置若有重复就跳过。
再遍历一次某个值不对就加入。
思路很简单但是效率不太行。
复杂度:
时间复杂度:遍历两遍O(n)
空间复杂度:O(1)
代码:
public List<Integer> findDisappearedNumbers(int[] nums) {
List<Integer> res = new ArrayList<>();
for(int i =0;i<nums.length;++i){
//如果数值不对,就换到对的坐标,若坐标已有对的值就不换
while(nums[i]!=i+1 && nums[nums[i]-1]!=nums[i] ) swap(nums,i,nums[i]-1);
}
for(int i =0;i<nums.length;++i){
if(nums[i]!=i+1) res.add(i+1);
}
return res;
}
private void swap(int[] nums,int a,int b){
int temp = nums[a];
nums[a] = nums[b];
nums[b] = temp;
}