zoukankan      html  css  js  c++  java
  • 287. Find the Duplicate Number 找出数组中的重复数字

    [抄题]:

    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.

    Example 1:

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

    Example 2:

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

     

     [暴力解法]:

    时间分析:

    空间分析:

     [优化后]:

    时间分析:

    空间分析:

    [奇葩输出条件]:

    [奇葩corner case]:

    [思维问题]:

    以为要用位运算,结果是:出现两次的value当作指针,数组形成环。所以用快慢指针

    [英文数据结构或算法,为什么不用别的数据结构或算法]:

    [一句话思路]:

    数组中的一步两步:value变成index,用数组包起来

    一层/两层

    slow = nums[slow];
                
    fast = nums[nums[fast]];

     

    [输入量]:空: 正常情况:特大:特小:程序里处理到的特殊情况:异常情况(不合法不合理的输入):

    [画图]:

    [一刷]:

    1. 不知道为什么要从头再走一遍:直接找的中点是从中间断开的。为了从起点开始,需要再走一遍。

    [二刷]:

    [三刷]:

    [四刷]:

    [五刷]:

      [五分钟肉眼debug的结果]:

    [总结]:

    直接找的中点是从中间断开的。为了从起点开始,需要再走一遍。

    [复杂度]:Time complexity: O(方) Space complexity: O(1)

    [算法思想:迭代/递归/分治/贪心]:

    [关键模板化代码]:

    //start again and move to slow
            fast = 0;
            while (fast != slow) {
                slow = nums[slow];
                fast = nums[fast];
            }

    [其他解法]:

    [Follow Up]:

    [LC给出的题目变变变]:

     [代码风格] :

     [是否头一次写此类driver funcion的代码] :

     [潜台词] :

    class Solution {
        public int findDuplicate(int[] nums) {
            //corner case
            if (nums == null || nums.length == 0) return -1;
            
            //initialization: slow, fast
            int slow = nums[0];
            int fast = nums[nums[0]];
            
            //find the number and store in slow
            while (fast != slow) {
                slow = nums[slow];
                fast = nums[nums[fast]];
            }
            //store in slow now
            
            //start again and move to slow
            fast = 0;
            while (fast != slow) {
                slow = nums[slow];
                fast = nums[fast];
            }
    
            //return
            return fast;
        }
    }
    View Code
  • 相关阅读:
    getline函数
    Java获取某年某月的第一天
    计划任务中使用NT AUTHORITYSYSTEM用户和普通管理员用户有什么差别
    Windows 7系统安装MySQL5.5.21图解
    C#高性能大容量SOCKET并发(十一):编写上传client
    Linux 终端訪问 FTP 及 上传下载 文件
    完毕port(CompletionPort)具体解释
    ping不通的几种可能原因
    Apple Swfit UI控件实现
    js中取session的值
  • 原文地址:https://www.cnblogs.com/immiao0319/p/9404113.html
Copyright © 2011-2022 走看看