• [LeetCode#268]Missing Number


    Problem:

    Given an array containing n distinct numbers taken from 0, 1, 2, ..., n, find the one that is missing from the array.

    For example,
    Given nums = [0, 1, 3] return 2.

    Note:
    Your algorithm should run in linear runtime complexity. Could you implement it using only constant extra space complexity?

    Credits:
    Special thanks to @jianchao.li.fighter for adding this problem and creating all test cases.

    Analysis:

    This kind of problem is very typical and quite tricky. 
    Condition: the numbers in the array are distinct, and all of them fall into the range [0, n], and the array's size is n.
    This condition means only one element would have no palce to reside in.
    
    Tricky skill:
    Scan from the first element, try to place all elements interwining with the number in the first element. 
    for (int i = 0; i < nums.length; i++) {
        while (nums[i] != i && nums[i] < nums.length) {
            int temp = nums[i];
            nums[i] = nums[nums[i]];
            nums[temp] = temp;
        }
    }
    Unless the nums[i] = nums.length, we could always find the right position for nums[i].
    Two stop cases:
    a. nums[i] == i, which means nums[i] was placed at the right position.
    b. nums[i] == nums.length, which means we could find no place to place the nums[i], otherwise exception appears. 
    
    During the whole process, we place nums[i] to the right position, and exchange the nums[nums[i]] back to continue the placement process. 
    
    After we finish the scan over the whole string, all placable elements were placed at their right positions. The unplacement element(if exist) was placed at the missing element's position. 
    
    Two cases for answer:
    1. the unplacement element was placed at the missing element's position.
    for (int j = 0; j < nums.length; j++) {
        if (nums[j] != j)
            return j;
    }
    2. all elements are placable, and they were placed at their right position. 
    return nums.length;
    
    
    
    Errors:
    while (nums[i] != i && i < nums.length) {
        int temp = nums[i];
        nums[i] = nums[nums[i]];
        nums[nums[i]] = temp;
    }
    The above code snippt could cause infinite loop.
    Case [1, 0]
    i = 0
    temp = nums[0] (1);
    nums[0] = nums[nums[0](1)] (0);
    nums[nums[0]0] = temp;(1)
    Do you see the loop?
    Even the logic in swapping is right, but the index<nums[i]> we use was changed in the middle!!!
    nums[i] was changed at: nums[i] = nums[nums[i]];
    This is very special, a way to fix it is to record nums[i]'s value
    while (nums[i] != i && nums[i] < nums.length) {
        int temp = nums[i];
        nums[i] = nums[nums[i]];
        nums[temp] = temp;
    }

    Solution:

    public class Solution {
        public int missingNumber(int[] nums) {
            if (nums == null || nums.length == 0)
                return 0;
            for (int i = 0; i < nums.length; i++) {
                while (nums[i] != i && nums[i] < nums.length) {
                    int temp = nums[i];
                    nums[i] = nums[nums[i]];
                    nums[temp] = temp;
                }
            }
            for (int j = 0; j < nums.length; j++) {
                if (nums[j] != j)
                    return j;
            }
            return nums.length;
        }
    }
  • 相关阅读:
    2016.07.13-map的使用(以leetcode1-Two Sum为例)
    2016.6.26——Maximum Depth of Binary Tree
    centos7下docker发布第一个微服务应用(Eureka)
    centos7下快速安装Nginx服务器
    java队列Queue及阻塞队列
    JConsole连接远程linux服务器配置
    mysql时间与字符串之间相互转换
    Tomcat启动报错:org.apache.catalina.LifecycleException: Failed to start component...java.util.zip.ZipException: error in opening zip file
    java post请求的表单提交和json提交简单小结
    wagon-maven-plugin实现自动打包部署到服务器
  • 原文地址:https://www.cnblogs.com/airwindow/p/4759179.html
Copyright © 2020-2023  润新知