classSolution: defcheckIfExist(self, arr: List[int]) -> bool: for i, a inenumerate(arr): for j, b inenumerate(arr): if i != j and a * 2 == b: returnTrue returnFalse
[]
1 2 3 4 5 6 7 8 9 10
classSolution { public: boolcheckIfExist(vector<int>& arr){ for (auto i = arr.begin(); i != arr.end(); ++i) for (auto j = arr.begin(); j != arr.end(); ++j) if (i != j && *i * 2 == *j) returntrue; returnfalse; } };
复杂度分析:
时间复杂度:O(n^2)
空间复杂度:O(1)
方法二:排序 + 双指针
先对所有数字进行排序。然后维护两个指针:指针 p 遍历数字 x,指针 q 寻找 2x。
对于 x>0 的情况,指针只需要一直前进。若 q 在前进过程中找到一个比 2x 大的数字,那么 2x 必然不存在。在 p 前进的过程中 p 所指向的 x 会不断递增,2x 也会不断递增,因此指针 q 不需要后退。
对于 x<0 的情况,指针只需要一直后退。若 q 在后退过程中找到一个比 2x 小的数字,那么 2x 必然不存在。在 p 后退的过程中 p 所指向的 x 会不断递减,2x 也会不断递减,因此指针 q 不需要前进。
[]
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16
classSolution: defcheckIfExist(self, arr: List[int]) -> bool: arr.sort() q = 0 for p inrange(len(arr)): while q < len(arr) and arr[p] * 2 > arr[q]: q += 1 if q != len(arr) and p != q and arr[p] * 2 == arr[q]: returnTrue q = len(arr) - 1 for p inrange(len(arr) - 1, -1, -1): while q > -1and arr[p] * 2 < arr[q]: q -= 1 if q != -1and p != q and arr[p] * 2 == arr[q]: returnTrue returnFalse
[]
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19
classSolution { public: boolcheckIfExist(vector<int>& arr){ sort(arr.begin(), arr.end()); for (auto i = arr.begin(), j = arr.begin(); i != arr.end(); ++i) { while (j != arr.end() && *i * 2 > *j) ++j; if (j != arr.end() && i != j && *i * 2 == *j) returntrue; } for (auto i = arr.rbegin(), j = arr.rbegin(); i != arr.rend(); ++i) { while (j != arr.rend() && *i * 2 < *j) ++j; if (j != arr.rend() && i != j && *i * 2 == *j) returntrue; } returnfalse; } };
classSolution: defcheckIfExist(self, arr: List[int]) -> bool: counter = collections.Counter(arr) for n in arr: if n != 0and counter[2 * n] >= 1: returnTrue if n == 0and counter[2 * n] >= 2: returnTrue returnFalse
[]
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15
classSolution { public: boolcheckIfExist(vector<int>& arr){ int cnt[4001] = {0}; int* hash_set = cnt + 2000; for (int n : arr) ++hash_set[n]; for (int n : arr) if (n != 0 && hash_set[2 * n] >= 1) returntrue; elseif (n == 0 && hash_set[2 * n] >= 2) returntrue; returnfalse; } };