package 剑指offer.二分查找;
import java.util.HashMap;
import java.util.Map;
public class 只出现一次的数字 {
public int singleNumber(int[] nums) {
HashMap<Integer,Integer> hashMap =new HashMap<>();
for (int i =0;i<nums.length;i++){
hashMap.put(nums[i],hashMap.getOrDefault(nums[i],0)+1);
}
for(Map.Entry<Integer,Integer> entry:hashMap.entrySet()){
if (1==entry.getValue()){
return entry.getKey();
}
}
return -1;
}
//二分查找法
/**
* 对数组两两分组,然后第一组同组数据不相同的。那么这个只出现一次的数,一定是第一个数
* 比如(1,1)(2,2)(3,4)(4,5)(5) 那么第一组不一样的是(3,4) 那么只出现一次的数就是3
* 我们对数组两两分组,对数组进行编号 然后二分查找,中间组的编号为mid,那么中间组的第一个数的下角标是i=2*mid
* 【i-2,i-1】 【i,i+1】
* 如果mid组两数相同 那么就从后半段找
* 如果mid两数不同,那么再检查这个数组是不是第一个不同的数组
* 方法是前一个组的两数相比较,若相同,那么该组就是第一个,若不同,从前一段查找。
* 还有一种情况就是mid组是不是第一组,如果是第一组说明第一个数字就是要找的数
* @param nums
* @return
*/
public int singleNonDuplicate(int[] nums) {
int left = 0;
int right = nums.length / 2;
while (left <= right) {
int mid = (left + right) / 2;
int i = mid * 2;
if (i < nums.length - 1 && nums[i] != nums[i + 1]) {
if (mid == 0 || nums[i - 2] == nums[i - 1]) {
return nums[i];
}
right = mid - 1;
} else {
left = mid + 1;
}
}
return nums[nums.length - 1];
}
}
剑指offer72 排序数组的只出现一次的数字【二分查找】
最新推荐文章于 2024-08-20 10:34:34 发布