LeetCode每日一题: 540. 有序数组中的单一元素

118 阅读1分钟

PK创意闹新春,我正在参加「春节创意投稿大赛」,详情请看:春节创意投稿大赛

image.png

class Solution {
    public int singleNonDuplicate(int[] nums) {
        int result = 0;
        for (int i = 0; i < nums.length; i++) {
            result ^= nums[i];
        }
        return result;
    }
}

思路1: 按位异或, 因为处了目标之外其他元素都出现了两次, 所以可以通过异或来拿到最终的值;
时间复杂度O(n) 空间复杂度O(1)
tips:0 ^ 0 = 0; 1 ^ 1 = 0; 0 ^ 1 = 1;

class Solution {
    public int singleNonDuplicate(int[] nums) {
        int i = 0, j = nums.length - 1; 
        while (i < j) {
            int mid = i + ((j - i) >> 1);
            if (mid % 2 == 0) {
                // 偶数
                if (nums[mid] == nums[mid + 1]) i = mid + 1;
                else j = mid;
            } else {
                // 奇数
                if (nums[mid] == nums[mid - 1]) i = mid + 1;
                else j = mid;
            }
        }
        return nums[i];
    }
}

思路2: 二分法, 根据mid奇偶数判断相应情况 时间复杂度O(logn) 空间复杂度O(1)