《LeetCode之每日一题》:84.找到所有数组中消失的数字
Posted 是七喜呀!
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了《LeetCode之每日一题》:84.找到所有数组中消失的数字相关的知识,希望对你有一定的参考价值。
题目链接: 找到所有数组中消失的数字
有关题目
给你一个含 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 == nums.length
1 <= n <= 10^5
1 <= nums[i] <= n
题解
法一:额外空间法
思路:
开辟额外空间,对原数组中出现的元素计数,最后遍历count数组,若count[i] == 0则表示i未出现
/**
* Note: The returned array must be malloced, assume caller calls free().
*/
int* findDisappearedNumbers(int* nums, int numsSize, int* returnSize){
int* count = (int*)calloc(numsSize + 1,sizeof(int));//计数,注意开辟空间的大小
for (int i = 0; i < numsSize; i++){
count[nums[i]]++;//出现以nums[i],count++;
}
int* ret = (int*)malloc(numsSize * sizeof(int));
*returnSize = 0;
for (int i = 1; i <= numsSize; i++){
if (count[i] == 0)
ret[(*returnSize)++] = i;
}
return ret;
}
时间复杂度:O(n)
空间复杂度:O(n)
法二:原地修改
思路:
原地修改数组,并还原。
/**
* Note: The returned array must be malloced, assume caller calls free().
*/
int* findDisappearedNumbers(int* nums, int numsSize, int* returnSize){
for (int i = 0; i < numsSize; i++){
int x = (nums[i] - 1) % numsSize;
//将所有的数组元素的值变为[0,numsSize - 1]的下标x
nums[x] += numsSize;//对于出现的x,我们做出标记
}
int* ret = (int*)malloc(sizeof(int) * numsSize);
*returnSize = 0;
for (int i = 0; i < numsSize; i++){
if (nums[i] <= numsSize){
ret[(*returnSize)++] = i + 1;
}
else
nums[i] %= numsSize;//顺带还原原位置上的值
}
return ret;
}
以上是关于《LeetCode之每日一题》:84.找到所有数组中消失的数字的主要内容,如果未能解决你的问题,请参考以下文章