代码编织梦想

题目

剑指 Offer II 070. 排序数组中只出现一次的数字
​​
​给定一个只包含整数的有序数组 nums ,每个元素都会出现两次,唯有一个数只会出现一次,请找出这个唯一的数字。

你设计的解决方案必须满足 O(log n) 时间复杂度和 O(1) 空间复杂度。

示例 1:

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

输入: nums =  [3,3,7,7,10,11,11]
输出: 10

思路

如果输入的数组没有经过排序,则可以用异或的方式来做:

由于两个相同的数字异或的结果是0,因此如果将数组中所有数字异或,最终的结果就

是那个唯一只出现一次的数字,时间复杂度为O(n)

但本题的数据经过排序,可以有更好的解法,即二分法:

  • 将数组中的数字两两分为一组
  • 最初的若干组数字相等
  • 直到遇到只出现一次的数后,后面每一组的数字都不相等
  • 因此可以通过二分找到第一个两个数不等的组,该组第一个数就是答案

代码

public int singleNonDuplicate(int[] nums) {
    int left = 0;
    int right = nums.length / 2;

    while (left < right) {
        int mid = left + right >> 1;
        // 如果已经是最后一组,该组的数就是答案
        if (mid == right) {
            return nums[nums.length-1];
        }

        // 判断组内两个数是否相等
        if (nums[mid * 2] == nums[mid * 2 + 1]) {
            // 找mid后面的组
            left = mid + 1;
        } else {
            // right右边的组不可能成为答案,right和right左边的组有可能
            right = mid;
        }
    }

    return nums[left * 2];
}
版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/qq_39383767/article/details/128047482

[剑指offer] java版题解(完整版)更新中。。。_weixin_34061482的博客-爱代码爱编程

序号题解牛客 OJ数据结构类型03[剑指offer] 二维数组中的查找二维数组中的查找数组04[剑指offer] 替换空格替换空格字符串05[剑指offer] 从尾到头打印链表从尾到头打印链表链表06[剑指offer] 重建二叉树重建二叉树树07[剑指offer] 用两个栈实现队列用两个栈实现队列栈、队列08[剑指offer] 旋转数组的最小数字旋转数

[剑指-Offer] 3. 数组中重复的数字(哈希、抽屉原理、代码优化、多方法)-爱代码爱编程

文章目录 1. 题目来源2. 题目说明3. 题目解析3.1 方法一:排序法3.2 方法二:数组哈希3.3 方法三:map哈希映射3.3 方法四:抽屉原理、空间复杂度 O

[剑指-Offer] 4. 二维数组中的查找(数学、二分法)-爱代码爱编程

文章目录 1. 题目来源2. 题目说明3. 题目解析3.1 方法一:暴搜3.2 方法二:数学规律法 1. 题目来源 链接:二维数组中的查找 来源:LeetCode——《剑指-Offer》专项 2. 题目说明 在一个 n * m 的二维数组中,每一行都按照从左到右递增的顺序排序,每一列都按照从上到下递增的顺序排序。请完成一个函数,输入这样的

[剑指-Offer] 11. 旋转数组的最小数字(二分法、分治、递归)-爱代码爱编程

文章目录 1. 题目来源2. 题目说明3. 题目解析方法一:二分法方法二:分治法、递归 1. 题目来源 链接:旋转数组的最小数字 来源:LeetCode——《剑指-Offer》专项 2. 题目说明 把一个数组最开始的若干个元素搬到数组的末尾,我们称之为数组的旋转。输入一个递增排序的数组的一个旋转,输出旋转数组的最小元素。例如,数组 [3,

[剑指-Offer] 40. 最小的k个数(快速排序、海量数据、巧妙解法)-爱代码爱编程

文章目录 1. 题目来源2. 题目说明3. 题目解析方法一:快排思想+ O (

[剑指-Offer] 45. 把数组排成最小的数(数学、思维、lambada表达式、巧妙解法)-爱代码爱编程

文章目录 1. 题目来源2. 题目说明3. 题目解析方法一:数学+思维+lambada表达式+巧妙解法 1. 题目来源 链接:把数组排成最小的数 来源:LeetCode——《剑指-Offer》专项 2. 题目说明 输入一个正整数数组,把数组里所有数字拼接起来排成一个数,打印能拼接出的所有数字中最小的一个。 示例 1: 输入: [

[剑指-Offer] 51. 数组中的逆序对(思维、归并排序、巧妙解法)-爱代码爱编程

文章目录 1. 题目来源2. 题目说明3. 题目解析方法一:TLE+暴力+常规解法方法二:思维+归并排序+巧妙解法 1. 题目来源 链接:数组中的逆序对 来源:LeetCode——《剑指-Offer》专项 2. 题目说明 在数组中的两个数字,如果前面一个数字大于后面的数字,则这两个数字组成一个逆序对。输入一个数组,求出这个数组中的逆序对的

[剑指-Offer] 53. I. 在排序数组中查找数字 I 及 II. 0~n-1中缺失的数字(二分法、代码优化、巧妙解法)-爱代码爱编程

文章目录 1. 题目来源2. 题目说明3. 题目解析 --- I. 在排序数组中查找数字 I方法一:遍历+常规解法方法二:二分法+递归+巧妙解法4. 题目解析 --- II. 0~n-1中缺失的数字4.1 方法一:遍历+常规解法方法二:二分法+巧妙解法 1. 题目来源 链接:I. 在排序数组中查找数字 I 链接:II. 0~n-1中缺失的数字

【算法】剑指 Offer 专项突击版 Day3数组部分-爱代码爱编程

【算法】剑指 Offer 专项突击版 Day3数组部分 题目地址:https://leetcode-cn.com/study-plan/lcof/?progress=wgzvtig 目标:要点总结,分享思路通俗代码,满足要求快速实现 文章目录 【算法】剑指 Offer 专项突击版 Day3数组部分I 【中等】007. 数组中和为 0 的三个数II

【leetcode】剑指 offer(专项突击版)汇总_friedrichor的博客-爱代码爱编程

文章目录 002. 二进制加法(反转相加 / 位运算)006. 排序数组中两个数字之和(二分查找 / 双指针)007. 数组中和为 0 的三个数(双指针)008. 和大于等于 target 的最短子数组(滑动窗口 /

剑指offer专项突破版(68)—— 山峰数组的顶部_亚洲第一中锋_哈达迪的博客-爱代码爱编程

题目 剑指 Offer II 069. 山峰数组的顶部 思路 虽然整个数组并不是排序的,但分成前后两段后每段都分别排序,因此可以用二分法尝试 如果二分出某个中点mid: rr[mid] > arr[mid-