287 Find the Duplicate Number

原题描述

Find the Duplicate Number
Given an array nums containing n + 1 integers where each integer is between 1 and n (inclusive), prove that at least one duplicate number must exist. Assume that there is only one duplicate number, find the duplicate one.

Note:
You must not modify the array (assume the array is read only).
You must use only constant, O(1) extra space.
Your runtime complexity should be less than O(n2).
There is only one duplicate number in the array, but it could be repeated more than once.

分析

提示使用二分搜索,考虑到元素取值限制在1~n内,可以先取n/2,并求出比n/2小的元素个数,如果此个数大于n/2则说明1~n/2中必定有重复的数,反正则在n/2~n中。接下来重复上述步骤即可。
此种方法用迭代很易实现,迭代函数变量中一个记录起始数字begin一个记录结束数字end,需注意的是迭代结束条件。一种情况是一直迭代到begin与end相等,则结果就是这个值;一种情况是begin不会等于end但此时(begin+end)/2与begin相等,则结果就是end。

代码示例

class Solution {
public:
    int recurse(vector<int>& nums, int begin, int end)
    {
        if (begin == end)
            return begin;
        int n = (begin + end) / 2;
        int count = 0;
        for (int i = 0; i < nums.size(); i++)
        {
            if (nums[i] <= n)
            {
                count++;
            }
        }
        if (count > n)
            return recurse(nums, begin, n);
        else if (begin == n)
            return end;
        else
            return recurse(nums, n, end);
    }

    int findDuplicate(vector<int>& nums) 
    {
        return recurse(nums, 1, nums.size() - 1);
    }
};
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值