📅  最后修改于: 2023-12-03 14:59:38.571000             🧑  作者: Mango
给定长度为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 时同时出现。
提示:
对于这道题,我们需要找到所有仅出现一次的元素,并且这些元素在同时出现了(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;
}