LeetCode287尋找重複數-----二分法(抽屜原理)
阿新 • • 發佈:2022-04-12
題目表述
給定一個包含 n + 1 個整數的陣列 nums ,其數字都在 [1, n] 範圍內(包括 1 和 n),可知至少存在一個重複的整數。
假設 nums 只有 一個重複的整數 ,返回 這個重複的數 。
你設計的解決方案必須 不修改 陣列 nums 且只用常量級 O(1) 的額外空間。
二分法(抽屜原理)
抽屜原理:將10個水果放進9個抽屜裡,一定存在某個抽屜至少含有2個水果。
思路:陣列nums包含n+1個整數,數字範圍為[1,n],所以可以根據二分找中間的數mid,然後判斷陣列中有多少個小於mid的數,如果小於mid的數的數目大於mid,根據抽屜原理,則重複元素就在mid的左邊,否則重複的數在mid的右邊。
public int findDuplicate(int[] nums) { int left = 0; int right = nums.length - 1; while(left <= right){ int mid = left + (right - left) / 2; int cnt = 0; for(int num : nums){ if(num <= mid){ cnt++; } } if(cnt > mid){ right = mid - 1; }else{ left = mid + 1; } } return left; }