1.一個整型數組 nums 裏除兩個數字之外,其他數字都出現了兩次。請寫程序找出這兩個只出現一次的數字。要求時間複雜度是O(n),空間複雜度是O(1)。
示例 1:
輸入:nums = [4,1,4,6]
輸出:[1,6] 或 [6,1]
示例 2:
輸入:nums = [1,2,10,4,1,4,3,3]
輸出:[2,10] 或 [10,2]
2.代碼展示
/**
* Note: The returned array must be malloced, assume caller calls free().
*/
int _QuickSort(int *nums, int left, int right)
{
int key = nums[right];
int index = right;
while (left < right)
{
while (left < right)
{
if (nums[left] > key)
{
nums[index] = nums[left];
index = left;
break;
}
++left;
}
while (left < right)
{
if (nums[right] < key)
{
nums[index] = nums[right];
index = right;
break;
}
--right;
}
}
nums[left] = key;
return left;
}
void QuickSort(int *nums, int left, int right)
{
if (left > right)
{
return;
}
int index = _QuickSort(nums, left, right);
QuickSort(nums, left, index - 1);
QuickSort(nums, index + 1, right);
}
//快排
//雙指針
int* singleNumbers(int* nums, int numsSize, int* returnSize) {
*returnSize = 0;
QuickSort(nums, 0, numsSize - 1);
for (int i = 0; i < numsSize; i++)
{
if (i+1<numsSize && nums[i] == nums[i + 1])
{
i = i + 1;
}
else
{
nums[(*returnSize)++] = nums[i];
}
}
return nums;
}
3.解題思路
先進行一個O(nlogn)的排序,然後一次遍歷O(n),選出只出現一次的數。
這個題還可以用相同數字抑或出來是0,來進行分組,然後篩選出來。