single number和变体

本文探讨了一种寻找数组中唯一单例元素的算法问题,该元素在数组中仅出现一次,而其他元素则成对出现。通过使用XOR操作和BinarySearch策略,文章详细介绍了如何在O(N)和O(logN)的时间复杂度下高效解决此问题,并附带了C++代码实现。
给array of integers
裡面有一个数字是单独出现  其他都会出现两次(而且一起出现)
ex: [1,2,2,3,3]
要判断哪个数字是单独出现的
以这个例子的话就是 1
LZ 一开始先说了用HashMap 去记出现几次
面试官说有没有不用额外空间的方式
我说 那就用XOR 去算吧   剩下来的那个就是单独出现的了  複杂度是O(N)
面试官说可以,但是希望再想其他方式可以优化的 比如说O(logN)複杂度
看到logN就想到binary serach了
不过一时没有想到怎麽个search法
面试官给了提示才推出来的
结论就是用index是基数或偶数 来判断 search砍半时应该往前找或往后找
//XOR版本

class Solution {
public:
    int singleNumber(vector<int>& nums) {
        int length = nums.size();
        int num = 0;
        for(int i = 0;i < length;i++)
            num ^= nums[i];
        return num;
    }
};


class Solution{
public:
    int singleNumber(vector<int>& nums){
        return single_core(nums,0,nums.size()-1);
    }
    int single_core(vector<int> nums,int start,int end){
        if(start == end)
            return nums[start];
        int length = end - start + 1;
        int mid = length/2;
        if((length/2)%2 == 0){
            if(nums[i] == nums[i-1])
                return single_core(nums,start,mid);
            if(nums[i] == nums[i+1])
                return single_core(nums,mid,end);
        }
        else{
            if(nums[i] == nums[i-1])
                return single_core(nums,mid+1,end);
            if(nums[i] == nums[i+1])
                return single_core(nums,start,mid-1);
        }
    }
}

偶数:12233、22331

奇数:2233441、1223344

那个单独的数一定是在奇数个中

转载于:https://www.cnblogs.com/ymjyqsx/p/9795065.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值