LeetCode Hot 熱題100 演算法題 287.尋找重複數-演算法&測試-medium模式
阿新 • • 發佈:2020-12-29
技術標籤:LeetCode演算法題leetcode資料結構演算法java二分查詢
LeetCode Hot 熱題100 演算法題 287.尋找重複數-演算法&測試-medium模式
給定一個包含(n+1)個整數的陣列nums,其數字都在1到n之間(包括1和n)。可知至少存在一個重複的整數。假設只有一個重複的整數,找出該數。
輸入:[1,3,4,2,2]
輸出:2
注意:
不能更改原陣列;
只能使用額外的O(1)空間;
時間複雜度小於O(n^2);
此陣列中只有一個重複的數字,但它可能不止重複出現一次。
package leetcode.medium; import java.util.HashSet; import java.util.Set; //287.尋找重複數 public class Solution287 { public static void main(String[] args) { int[] nums= {1,3,4,2,2}; S287FindDuplicate testFindDuplicate = new S287FindDuplicate(); System.out.println(testFindDuplicate.findDuplic(nums)); } } class S287FindDuplicate{ //法1:需要額外空間 public int findDuplicate(int[] nums) { Set<Integer> hashSet = new HashSet<Integer>(); for (int i = 0; i < nums.length; i++) { if (hashSet.contains(nums[i])) { return nums[i]; } hashSet.add(nums[i]); } return -1; } //法2:二分查詢 public int findDuplic(int[] nums) { int left=1; int right=nums.length-1; while(left<right) { int mid=(left+right)>>>1; int cnt = 0; for (int num : nums) { if (num<=mid) { cnt+=1; } } if (cnt>mid) { right=mid; }else { left=mid+1; } } return left; } }
參考:
https://leetcode-cn.com/problems/find-the-duplicate-number/solution/er-fen-fa-si-lu-ji-dai-ma-python-by-liweiwei1419