一【题目类别】
- 哈希表
二【题目难度】
- 简单
三【题目编号】
- 448.找到所有数组中消失的数字
四【题目描述】
- 给你一个含 n 个整数的数组 nums ,其中 nums[i] 在区间 [1, n] 内。请你找出所有在 [1, n] 范围内但没有出现在 nums 中的数字,并以数组的形式返回结果。
五【题目示例】
-
示例 1:
- 输入:nums = [4,3,2,7,8,2,3,1]
- 输出:[5,6]
-
示例 2:
- 输入:nums = [1,1]
- 输出:[2]
六【解题思路】
- 利用哈希表的思想
- 首先计算哪个元素在数组中
- 然后再找哪个元素不在数组中,并且在范围内
- 最后返回结果即可
七【题目提示】
- n = = n u m s . l e n g t h n == nums.length n==nums.length
- 1 < = n < = 1 0 5 1 <= n <= 10^5 1<=n<=105
- 1 < = n u m s [ i ] < = n 1 <= nums[i] <= n 1<=nums[i]<=n
八【题目进阶】
- 你能在不使用额外空间且时间复杂度为 O ( n ) O(n) O(n) 的情况下解决这个问题吗? 你可以假定返回的数组不算在额外空间内。
九【时间频度】
- 时间复杂度: O ( n ) O(n) O(n),其中 n n n 是字符串长度
- 空间复杂度: O ( 1 ) O(1) O(1)
十【代码实现】
- Java语言版
package DynamicProgramming;
import java.util.ArrayList;
import java.util.List;
public class p448_FindAllNumbersDisappearedInAnArray {
public static void main(String[] args) {
int[] nums = {4, 3, 2, 7, 8, 2, 3, 1};
List<Integer> res = findDisappearedNumbers(nums);
System.out.println("res = " + res);
}
public static List<Integer> findDisappearedNumbers(int[] nums) {
List<Integer> res = new ArrayList<>();
int resIndex = 0;
int[] map = new int[nums.length + 1];
for (int i = 0; i < nums.length; i++) {
map[nums[i]]++;
}
for (int i = 1; i <= nums.length; i++) {
if (map[i] == 0) {
res.add(i);
}
}
return res;
}
}
- C语言版
#include<stdio.h>
#include<stdlib.h>
int* findDisappearedNumbers(int* nums, int numsSize, int* returnSize)
{
int* res = (int*)calloc(numsSize, sizeof(int));
int resIndex = 0;
int* map = (int*)calloc(numsSize + 1, sizeof(int));
for (int i = 0; i < numsSize; i++)
{
map[nums[i]]++;
}
for (int i = 1; i <= numsSize; i++)
{
if (map[i] == 0)
{
res[resIndex++] = i;
}
}
*returnSize = resIndex;
return res;
}
/*主函数省略*/
十一【提交结果】
-
Java语言版
-
C语言版