LeetCode287. 尋找重複數
阿新 • • 發佈:2020-08-27
因為所有數字都在1n之間,所以我們可以列舉1n,然後再遍歷nums陣列看一下是不是有數字出現次數超過1次。
這樣時間複雜度是O(n^2),還可以優化。
考慮這樣一種情況,如果每個數字x(1<=x<=n)在數組裡出現次數超過1次,則我們遍歷陣列的時候計算所有小於等於x的
數的個數cnt,cnt必然大於等於x。
而對於所有小於等於x的數,他們都只出現一次(因為題目說了只有一個數重複出現),則對於每個數分別計算nums數組裡小於等於他們的數
的個數,這個個數一定和這個數相等,也就是從1到他們自身的數的個數。
所以,我們可以通過二分,對於1~n中的數,分別計算nums陣列中小於等於這個數的元素個數,找出第一個,在陣列中小於等於這個數的元素的個數
大於自身的數,這個數,就是那個重複出現的數。
程式碼如下:
class Solution { public: int findDuplicate(vector<int>& nums) { int n = nums.size(); if(n == 0) { return 0; } int left = 1, right = n; // 從在區間[1, n]內進行二分查詢 while(left < right) { int mid = left + right >> 1; int cnt = 0; // cnt計算nums陣列中小於等於mid的元素個數 for(int i = 0; i < n; ++i) { if(nums[i] <= mid) { ++cnt; } } if(cnt > mid) { // 如果cnt > mid, 說明重複元素在區間[1, mid] right = mid; } else { // 否則,說明重複元素在區間[mid + 1, n] left = mid + 1; } } return left; } };