zoukankan      html  css  js  c++  java
  • Find All Numbers Disappeared in an Array

    Find All Numbers Disappeared in an Array 
    
    题目描述
    Given an array of integers where 1 ≤ a[i] ≤ n (n = size of array), some elements appear twice and others appear once.
    
    Find all the elements of [1, n] inclusive that do not appear in this array.
    
    Could you do it without extra space and in O(n) runtime? You may assume the returned list does not count as extra space.
    
    Example:
    
    Input:
    [4,3,2,7,8,2,3,1]
    
    Output:
    [5,6]
    
    
    
    solution1:
    方法一
    把list转成set 直接就去重了,然后从1到n,挨个判断是否在set里
    2,解题思路:
    正负号标记法
    遍历数组nums,记当前元素为n,令nums[abs(n) - 1] = -abs(nums[abs(n) - 1])
    再次遍历nums,将正数对应的下标+1返回即为答案,因为正数对应的元素没有被上一步骤标记过。
    
    class Solution{
    public:
        vector<int> findDisappearNumbers(vector<int>& nums){
            int len = nums.size();
            for(int i = 0; i < len; i++){
                int m = abs(nums[i])-1;//index start from 0
                nums[m] = nums[m] > 0 ? -nums[m]: nums[m];
            }
    
            vector<int> res;
            for(int i = 0; i < len; i++){
                if(nums[i] > 0)
                    res.push_back(i+1);
            }
            return res;
        }
    };
    
    方法3:
    第二种方法是将nums[i]置换到其对应的位置nums[nums[i]-1]上去,比如对于没有缺失项的正确的顺序应该是[1, 2, 3, 4, 5, 6, 7, 8],而我们现在却是[4,3,2,7,8,2,3,1],我们需要把数字移动到正确的位置上去,比如第一个4就应该和7先交换个位置,以此类推,最后得到的顺序应该是[1, 2, 3, 4, 3, 2, 7, 8],我们最后在对应位置检验,如果nums[i]和i+1不等,那么我们将i+1存入结果res中即可,参见代码如下:
    
    class Solution{
    public:
        vector<int> findDisappearedNumbers(vector<int>& nums){
            vector<int> res;
            for(int i = 0; i < nums.size(); i++){
                if(nums[i] != nums[nums[i]-1]){
                    swap(nums[i],nums[nums[i]-1]);
                    --i;
                }
            }
    
            for(int i = 0; i < nums.size(); i++){
                if(nums[i] != i+1){
                    res.push_back(i+1);
                }
            }
            return res;
        }
    };
    
    方法4:下面这种方法是在nums[nums[i]-1]位置累加数组长度n,注意nums[i]-1有可能越界,所以我们需要对n取余
    ,最后要找出缺失的数只需要看nums[i]的值是否小于等于n即可,最后遍历完nums[i]数组为[12, 19, 18, 15, 8, 2, 11, 9],
    我们发现有两个数字8和2小于等于n,那么就可以通过i+1来得到正确的结果5和6了,参见代码如下:
    //此解法待进一步理解
    class Solution{
    public:
        vector<int> findDisappearedNumbers(vector<int>& nums){
            vector<int> res;
            int n = nums.size();
            for(int i = 0; i < n; ++i){
                nums[(nums[i]-1)%n] += n;
            }
    
            for(int i = 0; i < n; ++i){
                if(nums[i] <= n){
                    res.push_back(i+1);
                }
            }
        }
    };
    
    
    
    
    
    references: 
    https://blog.csdn.net/qjh5606/article/details/81355329?depth_1-utm_source=distribute.pc_relevant.none-task&utm_source=distribute.pc_relevant.none-task
    http://bookshadow.com/weblog/2016/11/01/leetcode-find-all-numbers-disappeared-in-an-array/
    https://blog.csdn.net/sinat_31790817/article/details/78695249
    https://www.cnblogs.com/grandyang/p/6222149.html
    

      

    怕什么真理无穷,进一寸有一寸的欢喜。---胡适
  • 相关阅读:
    Java实现 蓝桥杯 算法提高 7-1用宏求球的体积
    Java实现 蓝桥杯 算法提高 递推求值
    Java实现 蓝桥杯 算法提高 矩阵相乘
    当时忍住就好了——关键时刻忍得住,告别容易后悔的人生
    心若向阳,何惧忧伤——没有注定的不幸,只有死不放手的执着——人大部分的痛苦,都是不肯离场的结果
    你只需努力 剩下的交给时光(你不对自己狠,就别怪别人对你狠)
    事情已经到了这一步,要赌就只能全力以赴——红朝的那些事情(四三二)
    SlimFTPd, LFTP和FileZilla Client/Server
    Redis .NET开源组件Beetle.Redis
    .NET/ASP.NETMVC 深入剖析 Model元数据、HtmlHelper、自定义模板、模板的装饰者模式2
  • 原文地址:https://www.cnblogs.com/hujianglang/p/12467399.html
Copyright © 2011-2022 走看看