Leetcode

Leetcode.287.Find the Duplicate

2019-12-17  本文已影响0人  Jimmy木

题目

给定n+1个数字,数字都是从1~n的数字,这些数字只有1个重复数字,找出重复数字。
要求:空间复杂度为O(1),不能移动数组。

Input: 2,2,2
Output:2
Input:1,3,4,2,2
Output:2
Input: 3,1,3,4,2
Output:3

思路1

直接循环暴力求解。

int findDuplicate(vector<int>& nums) {

    int res = 0;
    for (int i = 0; i < nums.size()-1;i++) {
        res = nums[i];
        for (int j = i+1; j < nums.size();j++) {
            if (res == nums[j]) {
                return res;
            }
        }
    }
    return 0;
}

思路2

类似于二分法。由于数字从1n,所以当1n/2的数字小于n/2时,数字一定在上半区。

int findDuplicate(vector<int>& nums) {
    int low = 1, high = (int)nums.size()-1;
    while (low < high) {
        int mid = (low + high) / 2;
        int count = 0;
        for (int i = 0; i < nums.size(); i++) {
            if (nums[i] <= mid) count++;
        }
        if (count > mid) {
            high = mid;
        } else {
            low = mid+1;
        }
    }
    return high;
}

总结

灵活运用条件,找到不变量和变量。

上一篇下一篇

猜你喜欢

热点阅读