LeetCode 645. 錯誤的集合(C、C++、python)
阿新 • • 發佈:2018-11-21
集合 S
包含從1到 n
的整數。不幸的是,因為資料錯誤,導致集合裡面某一個元素複製了成了集合裡面的另外一個元素的值,導致集合丟失了一個整數並且有一個元素重複。
給定一個數組 nums
代表了集合 S
發生錯誤後的結果。你的任務是首先尋找到重複出現的整數,再找到丟失的整數,將它們以陣列的形式返回。
示例 1:
輸入: nums = [1,2,2,4] 輸出: [2,3]
注意:
給定陣列的長度範圍是 [2, 10000]。
給定的陣列是無序的。
C
/** * Return an array of size *returnSize. * Note: The returned array must be malloced, assume caller calls free(). */ int* findErrorNums(int* nums, int numsSize, int* returnSize) { int n=numsSize; sort(nums,0,n-1); int r1; for(int i=1;i<n;i++) { if(nums[i]==nums[i-1]) { r1=nums[i]; break; } } int s1=0; for(int i=0;i<n;i++) { s1+=nums[i]; } int s0=s1-r1; int s2=0; for(int i=1;i<=n;i++) { s2+=i; } int* res=(int*)malloc(sizeof(int)*2); res[0]=r1; res[1]=s2-s0; *returnSize=2; return res; } void sort(int *a, int left, int right) { if(left >= right) { return ; } int i = left; int j = right; int key = a[i]; while(i < j) { while(i < j && key <= a[j]) { j--; } a[i] = a[j]; while(i < j && key >= a[i]) { i++; } a[j] = a[i]; } a[i] = key; sort(a, left, i - 1); sort(a, i + 1, right); }
C++
class Solution { public: vector<int> findErrorNums(vector<int>& nums) { int n=nums.size(); set<int> tmp; int s0=0; int s1=0; int s2=0; for(int i=0;i<n;i++) { tmp.insert(nums[i]); s1+=nums[i]; s2+=i+1; } set<int>::iterator it; for(it=tmp.begin();it!=tmp.end();it++) { s0+=*it; } return {s1-s0,s2-s0}; } };
python
class Solution: def findErrorNums(self, nums): """ :type nums: List[int] :rtype: List[int] """ n=len(nums) s1=sum(nums) b=set(nums) s0=sum(b) s2=0 for i in range(1,n+1): s2+=i return [s1-s0,s2-s0]