【LeetCode】961. 在长度 2N 的数组中找出重复 N 次的元素

961. 在长度 2N 的数组中找出重复 N 次的元素


961. 在长度 2N 的数组中找出重复 N 次的元素

题目大意

给你一个整数数组 nums ,该数组具有以下属性:
nums.length == 2 * n.
nums 包含 n + 1 个 不同的 元素
nums 中恰有一个元素重复 n 次
找出并返回重复了 n 次的那个元素。

示例:

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

数据范围:

2 <= n <= 5000
nums.length == 2 * n
0 <= nums[i] <= 104
nums 由 n + 1 个 不同的 元素组成,且其中一个元素恰好重复 n 次

思路

由题意知在2n个数中有n+1个不同的数,则对这些数分段两两分析,在[a0,a1], [a2, a3], …, [a2n-2, a2n-1]的n个区间中,若存在i使得ai = ai+1,则ai为所求的的数。
否则若不存在ai=ai+1,则说明所求的数在每个区间内都出现一次,则a0与a1中必有一个为答案,与a2、a3对比判断一下即可。

代码

class Solution {
public:
    int repeatedNTimes(vector<int>& nums) {
        int n = nums.size();
        for(int i = 0; i < n; i += 2){
            if(nums[i] == nums[i + 1]) return nums[i];
        }
        
        if(nums[0] == nums[2] || nums[0] == nums[3]) return nums[0];
        else return nums[1];
    }
};

复杂度

时间复杂度:O(n)
空间复杂度:O(1)

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值