1. 程式人生 > 其它 >LeetCode Hot 熱題100 演算法題 287.尋找重複數-演算法&測試-medium模式

LeetCode Hot 熱題100 演算法題 287.尋找重複數-演算法&測試-medium模式

技術標籤: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