排序数组中只出现一次的数字

  1. 链接:
    https://leetcode.cn/problems/skFtm2/
  2. 题目:
    给定一个只包含整数的有序数组 nums ,每个元素都会出现两次,唯有一个数只会出现一次,请找出这个唯一的数字。
    示例:

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

  1. 思路:
    因为数组有序,所以出现两次的元素是紧紧挨在一起的。
    所以我们可以把该数组看成两串数组,一串由偶数索引组成,一串由奇数索引组成。
    然后,我们对两串数组进行一一比较,当元素不相等时,返回偶数索引的元素。
    比如:nums = [1,1,2,3,3,4,4,8,8]
    首先,将数组元素与索引进行一一对照。
    在这里插入图片描述
    然后,可以分为两串数组。
    在这里插入图片描述对两串数组进行一一对比。找出不相等的元素,并返回。
    在这里插入图片描述
  2. 代码:
class Solution {
public:
    int singleNonDuplicate(vector<int>& nums) {
    //i用来记录偶数索引数组,j用来记录奇数索引数组
        int n=nums.size(),i,j;
    //当数组元素小于2时,数组元素即为我们要找的值
        if(n<2)
        return nums[0];
        for(i=0,j=1;i<n&&j<n;){
        //一旦奇偶索引的元素不相等,救返回偶数索引的值
            if(nums[i]!=nums[j])
            return nums[i];
        //因为分奇偶索引,索引i,j每次+2
            i+=2;
            j+=2;
        }
        //如,nums=[1,1,2],在进行上面的比较时,超出数组范围,
        //直接返回最后的偶数索引值
        return nums[i];
    }
};
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值