题目
Find All Duplicates in an Array
Given an array of integers, 1 ≤ a[i] ≤ n (n = size of array), some elements appear twice and others appear once.
Find all the elements that appear twice in this array.
Could you do it without extra space and in O(n) runtime?
Example:
Input:
[4,3,2,7,8,2,3,1]
Output:
[2,3]
标签
Array
难度
中等
分析
题目意思是给定一个整形数组,1<=a[i]<=n,n为数组的大小,数组的数字有可能出现两次或者一次,找到里面出现两次的数字。
解题思路是,遍历数组每个数字,把数字对应的数组下标所对应的数字,置为负数,然后再判断通过置负数的标志,来统计重复两次的数字。比如[4,3,2,7,8,2,3,1],输出如下
C代码实现
/**
* Return an array of size *returnSize.
* Note: The returned array must be malloced, assume caller calls free().
*/
int* findDuplicates(int* nums, int numsSize, int* returnSize) {
int * ret = (int *)malloc(sizeof(int));
int i=0, j=0, index=0;
for(i=0; i<numsSize; i++)
{
index = abs(nums[i]) - 1;
//printf("nums[%d]:%2d index:%2d nums[index-1]:%2d\n", i, nums[i], index, nums[index]);
if(nums[index] < 0)
{
ret[ j++] = abs(nums[i]);
ret = (int *)realloc(ret, (j+1)*sizeof(int));
*returnSize = j;
}
else
nums[index] = -nums[index];
}
return ret;
}