📜  C |数组|问题12(1)

📅  最后修改于: 2023-12-03 14:59:38.571000             🧑  作者: Mango

C语言数组问题12

问题描述

给定长度为n的整数数组nums, 找到所有出现的唯一的元素,仅当它在同时出现了(nums[i], nums[j]) 中的 i 与 j 时,元素才是唯一的。

返回数组中的所有唯一元素,以任意顺序。

示例1:

输入: nums = [1,2,1,3,2,5]

输出: [3,5]

解释: 3和5只出现了一次,同时它们在数组的 i=2 与 j=5 时同时出现。

示例2:

输入: nums = [1,2,1,3,2,1]

输出: [3]

解释: 3只出现了一次,同时它在数组的 i=3 与 j=4 时同时出现。

提示:

  1. 1 <= nums.length <= 1000
  2. 1 <= nums[i] <= 1000
解法

对于这道题,我们需要找到所有仅出现一次的元素,并且这些元素在同时出现了(nums[i], nums[j]) 中的 i 与 j 时,元素才是唯一的。

我们可以用散列表来统计每个元素出现的次数,然后再遍历数组找到同时出现的唯一元素即可。

我们遍历一遍数组,统计每个元素出现的次数,然后再遍历一遍数组,对于每个元素,判断该元素是否出现了一次,如果是则判断该元素在数组中的其他位置是否也出现了一次,如果是则该元素就是唯一元素。

代码如下:

#include <stdio.h>
#include <stdlib.h>

int* uniqueElements(int* nums, int numsSize, int* returnSize) {

    int* count = (int*)calloc(1001, sizeof(int)); // 统计每个元素出现的次数
    int* result = (int*)calloc(numsSize, sizeof(int)); // 存放唯一元素
    int k = 0;
    
    for(int i = 0; i < numsSize; ++i) {
        ++count[nums[i]]; // 统计每个元素出现的次数
    }
    
    for(int i = 0; i < numsSize; ++i) {
        if (count[nums[i]] == 1) { // 判断该元素是否出现了一次
            int j = 0;
            for (; j < numsSize; ++j) {
                if (nums[j] == nums[i]) { // 判断其他位置是否也出现了该元素
                    continue;
                }
                if (count[nums[j]] == 1 && nums[j] != nums[i]) { //判断该元素在其他位置是否也是唯一元素
                    break;
                }
            }
            if (j == numsSize) {
                result[k++] = nums[i];
            }
        }
    }
    
    *returnSize = k;
    free(count);
    count = NULL;
    return result;
}

int main() {
    int nums[] = {1,2,1,3,2,5};
    int numsSize = sizeof(nums)/sizeof(nums[0]);
    int returnSize = 0;
    
    int* result = uniqueElements(nums, numsSize, &returnSize);
    
    for (int i = 0; i < returnSize; ++i) {
        printf("%d ", result[i]);
    }
    printf("\n");
    
    free(result);
    result = NULL;
    
    return 0;
}

复杂度分析
  • 时间复杂度:O(n^2),需要遍历两遍数组,其中第二次遍历的元素个数不超过n个,因此总时间复杂度为O(n^2)。
  • 空间复杂度:O(1001),需要一个长度为1001的数组来统计每个元素出现的次数,因此空间复杂度为O(1001)。