zoukankan      html  css  js  c++  java
  • 287. 寻找重复数 (JAVA)

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

    假设 nums 只有 一个重复的整数 ,找出 这个重复的数 。

    示例 1:

    输入:nums = [1,3,4,2,2]
    输出:2
    示例 2:

    输入:nums = [3,1,3,4,2]
    输出:3
    示例 3:

    输入:nums = [1,1]
    输出:1
    示例 4:

    输入:nums = [1,1,2]
    输出:1
     

    提示:

    2 <= n <= 3 * 10^4
    nums.length == n + 1
    1 <= nums[i] <= n
    nums 中 只有一个整数 出现 两次或多次 ,其余整数均只出现 一次
     

    进阶:

    如何证明 nums 中至少存在一个重复的数字?
    你可以在不修改数组 nums 的情况下解决这个问题吗?
    你可以只用常量级 O(1) 的额外空间解决这个问题吗?
    你可以设计一个时间复杂度小于 O(n2) 的解决方案吗?

    思路:

    如果可以改变原数组,那很简单,将nums[i]放入index为nums[i]-1的位置。

    现在不能改变数组,且时间复杂度<O(n^2), 想到二分法=>时间复杂度O(nlogn)。

    如果是排序的数组,那么二分法时可以和中间位比较。无需数组的二分法,需要比较区域[start,mid]中的数量与区域长度,如果大于,说明其中有重复数。

    class Solution {
        public int findDuplicate(int[] nums) {
            return dfs(nums, 0, nums.length-1);
        }
        
        private int dfs(int[] nums, int start, int end){
            if(start == end) {
                return start+1;
            }
            int middle = (start + end) >> 1;
            int leftCount = 0;
            int rightCount = 0;
            for(int i = 0; i < nums.length; i++){
                if(nums[i] > start && nums[i] <= middle+1) {
                    leftCount++;
                } else if(nums[i] > middle+1 && nums[i] <= end+1) {
                    rightCount++;
                } 
            }
    
            if(leftCount > middle - start + 1) {
                return dfs(nums, start, middle);
            } else {
                return dfs(nums, middle+1, end);
            }
        }
    }
  • 相关阅读:
    layui 相关知识
    ideal debug 启动不起来
    删除命令 rm -rf maven-project-jxcg.zip 解压 unzip maven-project-jxcg.zip
    vsb 配置
    cmd dos
    switch
    Element UI 框架搭建
    mysql 远程连接设置
    YApi可视化接口管理平台 接口
    报403错误
  • 原文地址:https://www.cnblogs.com/qionglouyuyu/p/14664964.html
Copyright © 2011-2022 走看看