287. Find the Duplicate Number

来源:互联网 发布:淘宝的数据魔方 编辑:程序博客网 时间:2024/04/29 17:45

Problem

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:

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

Solution

第一种解法,把它看成一个linked list , 当前index所对应的数值就是下一个要找位置的index。
简化成另外一个题目  142 Linked List Cycle II

class Solution {public:    int findDuplicate(vector<int>& nums) {        const int N = nums.size();        if(N < 2) return -1;                int slow = 0, fast = 0;        while(true) {            slow = nums[slow];            fast = nums[nums[fast]];            if(slow == fast) {                break;            }        }              int finder = 0;       while(true) {           finder = nums[finder];           slow = nums[slow];           if(slow == finder) return slow;       }    }};

第二种解法,用 binary search 的思想,每次去一半

  public static int findDuplicate(int[] nums) {    if (nums.length == 0 || nums == null)        return 0;    int low = 1, high = nums.length - 1, mid;    while (low < high) {        mid = low + (high - low) / 2;        int count = 0;        for (int i = 0; i < nums.length; i++) {            if (nums[i] <= mid)                count++;        }        if (count > mid)            high = mid;        else            low = mid + 1;    }    return low;}





0 0
原创粉丝点击