美文网首页
lintcode 633. 寻找重复的数

lintcode 633. 寻找重复的数

作者: Anseis | 来源:发表于2018-05-18 05:50 被阅读0次

链接

题里不让我们使用额外空间,同时不能使用暴力解法。

解法一:二分法

一直数字的范围是1~n, 取其中的中点mid,统计数组中的数字小于mid的个数,如果个数小于等于Mid, 则说明重复的数在mid后面,否则重复的数在mid前面。时间复杂度O(NlgN)

public class Solution {
    /**
     * @param nums: an array containing n + 1 integers which is between 1 and n
     * @return: the duplicate one
     */
    public int findDuplicate(int[] nums) {
        write your code here
        int start = 1;
        int end = nums.length - 1;
        while(start + 1 < end){
            int mid = (end - start)/2 + start;
            if(count(nums, mid) <= mid){
                start = mid;
            }else{
                end = mid;
            }
        }
        if(count(nums, start) <= start){
            return end;
        }else{
            return start;
        }
       
    }
    int count(int[] nums, int k){
        int cnt = 0;
        for(int n: nums){
            if(n <= k){
                cnt++;
            }
        }
        return cnt;
    }
}

解法二:快慢指针法

可以把数组想成一个index和value的映射链表,可知value有重复的,所以一定会出现环的情况,快慢指针验证环并找交点。时间复杂度O(N)

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

相关文章

  • lintcode 633. 寻找重复的数

    链接 题里不让我们使用额外空间,同时不能使用暴力解法。 解法一:二分法 一直数字的范围是1~n, 取其中的中点mi...

  • [leetcode/lintcode 题解] 寻找重复的数 ·

    【题目描述】 给出一个数组 nums 包含 n + 1 个整数,每个整数是从 1 到 n (包括边界),保证至少存...

  • LintCode 寻找缺失的数

    题目 给出一个包含 0 .. N 中 N 个数的序列,找出0 .. N 中没有出现在序列中的那个数。 样例N = ...

  • 力扣每日一题:633.平方数之和

    633.平方数之和 https://leetcode-cn.com/problems/sum-of-square-...

  • 8.数学(八)

    题目汇总https://leetcode-cn.com/tag/math/633. 平方数之和简单[✔]640. ...

  • 633. 平方数之和

    给定一个非负整数 c ,你要判断是否存在两个整数 a 和 b,使得 a^2 + b^2 = c。 示例1: 示例2...

  • 633. 平方数之和

    这道题有几个数学做法比较有意思。 题目描述 给定一个非负整数c,你要判断是否存在两个整数a和b,使得a^2+b^2...

  • 633. 平方数之和

    1.题目 给定一个非负整数 c ,你要判断是否存在两个整数 a 和 b,使得 a^2 + b^2 = c 。 示...

  • lintcode 落单的数(|,||,|||)

    (|)给出2*n + 1 个的数字,除其中一个数字之外其他每个数字均出现两次,找到这个数字。样例给出 [1,2,2...

  • lintcode 丑数

    设计一个算法,找出只含素因子2,3,5 的第 n 大的数。直接寻找丑数,由定义可知,丑数是由2m,3n,5^l,因...

网友评论

      本文标题:lintcode 633. 寻找重复的数

      本文链接:https://www.haomeiwen.com/subject/wkjwdftx.html