LeetCode_645_数组_错误集合

Posted 軒邈

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了LeetCode_645_数组_错误集合相关的知识,希望对你有一定的参考价值。

原创:

int* findErrorNums(int* nums, int numsSize, int* returnSize)

    int *pArryVal = (int *)malloc(sizeof(int)*2); /* pArryVal[0]用来存储重复的值 和 pArryVal[1]用来存储丢失的值 */
    int iArry[numsSize + 1];   /* 该数组是来存储 nums 数组中每个元素出现的次数 */

    *returnSize = 2; /* 返回数组的元素的个数 */
    memset(iArry,0,sizeof(iArry)); /* 注意在使用前面清理下,否则里面存储的是垃圾值 */

    for(int i = 0; i < numsSize; i++) /* 因为 nums 中的元素是从 0 开始存储的,所以这里遍历是从 0 开始 */
    
        iArry[nums[i]] ++; /* 将 nums 数组中的值当作 iArry 的下标来进行 ++ ,因为根据题目他是个1~n的值,所以可以根据这一特性 */    
    

    for(int i = 1; i <= numsSize; i++) /* 此时 i 就相当于 nums 数组中的值,对其进行遍历,注意这里需要是等号 */
    
        if(iArry[i] == 0) /* 一次都没有出现,说明这个值就是丢失的值 */
        
            pArryVal[1] = i;
        
        
        if(iArry[i] == 2) /* 出现了两次,说明这个值就是重复的值 */
        
            pArryVal[0] = i;
        
    

    return pArryVal;

解释:

/*
    举例说明下,为什么需要加上“=”号:
        1.第一在上面定义存储 nums 数组每个元素出现的次数时,数组的大小是 numsSize + 1;
        
        2.为什么是 numsSize + 1? 举例:[5,4,4,2,1] 这个是  nums 数组;你会发现,他最大的值为5,
          那么如果他要作为数组的下标的话,那么这个数组的长度需要是6才可以,不然就会越界,
          因为数组的下标是从0开始计数的;
          
        3.所以在下面数组遍历的时候,需要算上 numsSize ,因为其本来就是一个正常数组下标,再举例,[1,1] 为 nums 数组,
          那么此时计数元素次数的数组中,iArry[1] = 2; iArry[2] = 0; 并且 iArry[2] 就是
          表示的丢失的数,因为 nums 数组中元素的大小是从1~n,所以计数数组中所有的 iArry[0]
          都是等于0的,无意义。
*/

总结:

不单单需要知道,还得掌握,掌握就要弄得清清楚楚!

以上是关于LeetCode_645_数组_错误集合的主要内容,如果未能解决你的问题,请参考以下文章

错误的集合_leetcode

leetcode 645. 错误的集合(Set Mismatch)

certificate verify failed (_ssl.c:645),conda镜像添加错误

LeetCode题目记录-645. 错误的集合(C++代码实现)

LeetCode 645 错误的集合[Map 桶排序 双指针] HERODING的LeetCode之路

645. 错误的集合