《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.找到所有数组中消失的数字的主要内容,如果未能解决你的问题,请参考以下文章

《LeetCode之每日一题》:213.最长和谐子序列

《LeetCode之每日一题》:49.连续数组

leetcode 每日一题 85. 最大矩形

《LeetCode之每日一题》:221.找到字符串中所有字母异位词

《LeetCode之每日一题》:79.数组的度

《LeetCode之每日一题》:240.找到小镇的法官