Leetcode 961:重复N次元素

题目描述

在大小为2N的数组A中有N+1个不同的元素,其中一个元素重复了N次。返回重复了N次的那个元素。

示例1

输入:[1,2,3,3]

输出:3

示例2

输入:[2,1,2,5,3,2]

输出:2

示例3 

输入:[5,1,5,2,5,3,5,4]

输出:5

 

解题思路

本题最容易想到是对原始序列进行排序,然后通过判断中间位置元素是否与最后一个元素相等判断重复出现N次的元素。时间复杂度是O(nlogn)。虽然本题可以通过,但是在面试中很有可能被问到能否在O(N)时间复杂度内完成。考虑数字的排序情况,例如示例3:可以看成先放好 1,2,3,4 ,然后相当于在5个空格中插入4个5,所有可能出现的情况可以分为三类:出现两个5相邻;没有相邻的情况,但是第一个位置和第三个位置元素相等,或第一个位置和最后位置相等;重复的元素全部出现在偶数位置上。

O(NlogN):

int repeatedNTimes(vector<int>& A) {
        sort(A.begin(),A.end());
        return A[A.size()/2]==A[A.size()-1]?A[A.size()/2]:A[A.size()/2-1];
    }

O(N):

int repeatedNTimes(vector<int>& A) {
        int i,len = A.size();
        for(i=0;i<len - 1;i++){
            if(A[i] == A[i+1]) return A[i];
        }
        if(A[0] == A[2] || A[0] == A[A.size()-1]) return A[0];
        return A[1];
    }

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值