LeetCode961 重複 N 次的元素
阿新 • • 發佈:2018-12-23
問題: 重複 N 次的元素
在大小為 2N
的陣列 A
中有 N+1
個不同的元素,其中有一個元素重複了 N
次。
返回重複了 N
次的那個元素。
示例 1:
輸入:[1,2,3,3] 輸出:3
示例 2:
輸入:[2,1,2,5,3,2] 輸出:2
示例 3:
輸入:[5,1,5,2,5,3,5,4] 輸出:5
提示:
4 <= A.length <= 10000
0 <= A[i] < 10000
A.length
連結:https://leetcode-cn.com/contest/weekly-contest-116/problems/n-repeated-element-in-size-2n-array/
分析:
0.AC做法,將資料排序,統計每個元素的個數,一旦某一個是N,返回這個數字。
1.2N個元素中有N+1個不同的元素,且一個元素重複了N次,則這個重複了N次的必定是唯一眾數,且除非是最大值或者最小值,否則也必定是中數。
比賽期間嘗試直接返回中位值,不過失敗了,沒繼續深入,現在想來,只有是最大值或者最小值的時候才會失敗,完全可以只統計最大值個數,最小值個數,如果有一個是N,返回,否則返回排序後中間的那個數字。
AC Code:
1 class Solution { 2 public: 3 int repeatedNTimes(vector<int>& A) { 4 if (A.size() == 2) 5 { 6 return A[0]; 7 } 8 int ret = 0; 9 sort(A.begin(), A.end()); 10 //ret = A[A.size() / 2]; 11 intnum = 1; 12 ret = A[0]; 13 for (unsigned int i = 1; i < A.size(); i++) 14 { 15 if (A[i] != ret) 16 { 17 ret = A[i]; 18 num = 1; 19 } 20 else 21 { 22 num++; 23 if (num == A.size() / 2) 24 { 25 return ret; 26 } 27 } 28 } 29 return ret; 30 } 31 };
賽後AC code
class Solution { public: int repeatedNTimes(vector<int>& A) { if (A.size() == 2) { return A[0]; } int ret = 0; sort(A.begin(), A.end()); int num = A[0]; int times = 1; for (int i = 1; i < A.size(); i++) { if (num != A[i]) { if (times == A.size() / 2) { return A[0]; } break; } else { times++; } } num = A[A.size() - 1]; times = 1; for (int i = A.size()-2;i>=0 ;i--) { if (num != A[i]) { if (times == A.size() / 2) { return num; } break; } else { times++; } } ret = A[A.size() / 2]; return ret; } };
其他:
1.簡單的題,隨便就過了,如果對時間有要求的話,可能就得用第二種方法才能過了。
不考慮太多,統計每個元素個數就夠了。
2.第一code:
1 class Solution: 2 def repeatedNTimes(self, A): 3 """ 4 :type A: List[int] 5 :rtype: int 6 """ 7 n = len(A)//2 8 l = dict() 9 for e in A: 10 if e in l: 11 l[e] += 1 12 else: 13 l[e] = 1 14 for e in l: 15 if l[e] == n: 16 return e
統計個數找個數是N的,可能都沒怎麼多想吧
第二code:
1 class Solution(object): 2 def repeatedNTimes(self, A): 3 """ 4 :type A: List[int] 5 :rtype: int 6 """ 7 d = set() 8 for num in A: 9 if num not in d: 10 d.add(num) 11 else: 12 return num
感覺更有意思一點,2N個元素,N+1個不同,其中一個還是有N個元素的,那麼其他的都是隻有一個元素,那麼完全可以更快:答案必定是A[A.size()/2]和A[A.size()/2-1]中的一個,如果兩者相同,即為結果,否則如果A[A.size()/2-1]==A[A.size()/2-2],是答案,否則A[A.size()/2]是答案。