码迷,mamicode.com
首页 > 其他好文 > 详细

leetcode 287 Find the Duplicate Number

时间:2016-02-25 15:28:34      阅读:143      评论:0      收藏:0      [点我收藏+]

标签:

题意:给一个长度为n+1的整数序列,其中的元素的范围在[1,n]之间,所以一定有重复的数字,假设只有一种重复的数字(但是重复可能不止一遍),求这个重复的数字,要求空间复杂度O(1),时间复杂度小于O(n2),不可以修改序列。

 

解法:二分。二分重复的数字,每次遍历一遍数组,记录cnt为有多少个元素小于等于二分值,如果cnt大于二分值,则说明重复的数字在左区间,否则重复的数字在右区间。这样做时间复杂度O(nlogn)。

二分真是个好用的东西吖……

 

代码:

class Solution {
public:
    int findDuplicate(vector<int>& nums) {
        int l, r, mid;
        l = 1;
        r = nums.size() - 1;
        mid = (l + r) >> 1;
        while(l < r) {
            int cnt = 0;
            for(int i = 0; i < nums.size(); i++) {
                if(nums[i] <= mid) cnt++;
            }
            if(cnt <= mid) l = mid + 1;
            else r = mid;
            mid = (l + r) >> 1;
        }
        return l;
    }
};

  

 

leetcode 287 Find the Duplicate Number

标签:

原文地址:http://www.cnblogs.com/Apro/p/5216746.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!