1. 题目
2. 题解
首先想到的是较为简单的解法,构建哈希表,将“存在”的数字存入哈希表中,之后遍历所有在 [1, n] 范围内的数字,查找数字是否在哈希表中,若不在表中,则该数字为“消失”的数字,实现代码如下。
// Go
func findDisappearedNumbers(nums []int) []int {
length:=len(nums)
var ls []int
var dict map[int]bool = make(map[int]bool)
for _, v := range nums{
dict[v]=true
}
for i:=1; i<=length; i++{
if _, ok:=dict[i]; !ok {
ls = append(ls, i)
}
}
return ls
}
构建哈希表占用了更多的存储空间,想要减少空间的使用,就需要在原有的数组中想方法标记“消失”的数据,同时要确保数组内原有数据依旧可获得。
发现 [1, n] 范围内的数字与数组下标存在对应关系,所以假设数组nums存在数字num,那么对nums[num-1]进行+n操作,在后续遍历数组遇到nums[num-1]数据时,进行%操作即可得到原有的数据。
遍历整个数组,若数组下标为num的值<n,那么num+1即为“消失”的数据。
// Java
class Solution {
public List<Integer> findDisappearedNumbers(int[] nums) {
List<Integer> ans = new ArrayList<Integer>();
int l = nums.length;
for(int n:nums){
int num=(n-1)%l;
nums[num]+=l;
}
for(int i=0; i<l; i++){
// System.out.println(nums[i]+" } "+l);
if(nums[i]<=l){
ans.add(i+1);
}
}
return ans;
}
}