Leetcode:287. 寻找重复数

Leetcode:287. 寻找重复数

题目描述

给定一个包含 n + 1 个整数的数组 nums,其数字都在 1 到 n 之间(包括 1 和 n),可知至少存在一个重复的整数。假设只有一个重复的整数,找出这个重复的数。

示例 1:

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

示例 2:

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

说明:

不能更改原数组(假设数组是只读的)。
只能使用额外的 O(1) 的空间。
时间复杂度小于 O(n2) 。
数组中只有一个重复的数字,但它可能不止重复出现一次。

思路

思路1

使用二分法统计小于mid数量,因为数字在1~n(n+1数组),若大于mid数量则在左侧,反之右侧

思路2

快慢指针的思路,因为范围有限以及有重复元素,所以可以看作是链表有环求交点位置

代码

代码1

class Solution {
    public int findDuplicate(int[] nums) {
        int left = 1;
        int right = nums.length - 1;
        
        while (left < right){
            int mid = (left + right) / 2;
            int count = 0;
            for(int num: nums){
                if (num <= mid){
                    count += 1;
                }
            }
            if (count > mid){
                right = mid;
            }else{
                left = mid + 1;
            }
        }
        return left;
    }
}

代码2

class Solution {
    public int findDuplicate(int[] nums) {
        int slow = nums[0];
        int fast = nums[0];
        do{
            slow = nums[slow];
            fast = nums[nums[fast]];
        }while(slow != fast);
        fast = nums[0];
        while(slow != fast){
            slow = nums[slow];
            fast = nums[fast];
        }
        return slow;
    }
}

复杂度分析

思路1时间复杂度

$Onlog(n)$

思路1空间复杂度

$O(1)$

思路2时间复杂度

$O(n)$

思路2空间复杂度

$O(1)$


文章作者: 小风雷
版权声明: 本博客所有文章除特別声明外,均采用 CC BY 4.0 许可协议。转载请注明来源 小风雷 !
评论
 上一篇
Leetcode:218. 天际线问题 Leetcode:218. 天际线问题
Leetcode: 218. 天际线问题题目描述城市的天际线是从远处观看该城市中所有建筑物形成的轮廓的外部轮廓。现在,假设您获得了城市风光照片(图A)上显示的所有建筑物的位置和高度,请编写一个程序以输出由这些建筑物形成的天际线(图B)。
2020-04-19
下一篇 
Leetcode:162. 寻找峰值 Leetcode:162. 寻找峰值
Leetcode:162. 寻找峰值题目描述峰值元素是指其值大于左右相邻值的元素。 给定一个输入数组 nums,其中 nums[i] ≠ nums[i+1],找到峰值元素并返回其索引。 数组可能包含多个峰值,在这种情况下,返回任何一个峰
2020-04-17
  目录