思路:
利于一个哈希表,把数据都存起来
代码:
class Solution {
public List<Integer> findDisappearedNumbers(int[] nums) {
List<Integer> res=new ArrayList<>();
Map<Integer,Integer> map=new HashMap<>();
for(int num:nums){
map.put(num,map.getOrDefault(num,0)+1);
}
for(int i=1;i<=nums.length;i++){
if(map.get(i)==null){
res.add(i);
}
}
return res;
}
}
原地哈希
class Solution {
public List<Integer> findDisappearedNumbers(int[] nums) {
List<Integer> res=new ArrayList<>();
int n=nums.length;
//原地哈希:
//每个出现的数都+n,那么最后出现的数一定都>n
//则<n的数就是没出现过的
for(int num:nums){
//计算下标
int x=(num-1)%n;
nums[x]+=n;
}
for(int i=0;i<n;i++){
if(nums[i]<=n){
//由下标变值只差1
res.add(i+1);
}
}
return res;
}
}
分解:
1)哈希表
2)原地哈希:
每个出现的数都+n,那么最后出现的数一定都>n,则<=n的数就是没出现过的
复杂度分析:
哈希表:
时间复杂度:O(N)
空间复杂度:O(N)
原地哈希:
时间复杂度:O(N)
空间复杂度:O(1)