leetcode练习 有序数组中的单一元素

文章目录

题目描述

给定一个只包含整数的有序数组,每个元素都会出现两次,唯有一个数只会出现一次,找出这个数。

示例:
输入: [1,1,2,3,3,4,4,8,8]
输出: 2

示例2:
输入: [3,3,7,7,10,11,11]
输出: 10

题目思路

暴力法
直接查找元素

class Solution {
    
    
    public int singleNonDuplicate(int[] nums) {
    
    
        for (int i = 0; i < nums.length - 1; i += 2) {
    
    
            if(nums[i]!=nums[i+1]){
    
    
                return nums[i];
            }
        }
        return nums[nums.length-1];
    }
}

哈希表查找

    public int singleNonDuplicate(int[] nums) {
    
    
        HashMap<Integer, Integer> map = new HashMap<>();
        for (int num : nums) {
    
    
            map.put(num, map.getOrDefault(num, 0) + 1);
        }
        int key = 0;
        for (Integer integer : map.keySet()) {
    
    
            if (map.get(integer).equals(1)){
    
    
                key = integer;
            }
        }
        return key;
    }

二分查找

    public int singleNonDuplicate(int[] nums) {
    
    
        int lo = 0;
        int hi = nums.length - 1;
        while (lo < hi) {
    
    
            int mid = lo + (hi - lo) / 2;
            boolean halvesAreEven = (hi - mid) % 2 == 0;
            if (nums[mid + 1] == nums[mid]) {
    
    
                if (halvesAreEven) {
    
    
                    lo = mid + 2;
                } else {
    
    
                    hi = mid - 1;
                }
            } else if (nums[mid - 1] == nums[mid]) {
    
    
                if (halvesAreEven) {
    
    
                    hi = mid - 2;
                } else {
    
    
                    lo = mid + 1;
                }
            } else {
    
    
                return nums[mid];
            }
        }
        return nums[lo];
    }

猜你喜欢

转载自blog.csdn.net/qq_45019698/article/details/108229189