LeetCode 260. Single Number III

本文提供了一种解决LeetCode题目“只出现一次的数字III”的算法思路,通过异或操作和位运算,实现了线性时间复杂度和常数空间复杂度的解决方案,适用于寻找数组中仅有的两个不重复元素。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

题目链接:只出现一次的数字 III - 力扣 (LeetCode)

Given an array of numbers nums, in which exactly two elements appear only once and all the other elements appear exactly twice. Find the two elements that appear only once.

Example:

Input:  [1,2,1,3,2,5]
Output: [3,5]

Note:

  1. The order of the result is not important. So in the above example, [5, 3] is also correct.
  2. Your algorithm should run in linear runtime complexity. Could you implement it using only constant space complexity?

只有两个单身,其他都是成对。找两个单身元素a和b
a和b的二进制表示必有第k位不同

把所有数按第k位分成两组,两组的异或和分别为a和b

class Solution {
public:
    vector<int> singleNumber(vector<int>& nums) {
        int sum = 0;
        for(auto x : nums) sum ^= x;
        
        int k = 0;
        while(!(sum >> k & 1)) k ++;
        // 第k位是1
        int s2 = 0, s3 = 0;
        for(auto x : nums)
            if(x >> k & 1)
                s2 ^= x;
        
        vector<int> res({s2, sum ^ s2});
        return res;
    }
};
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值