【Leetcode】448. Find All Numbers Disappeared in an Array

題目以下:javascript

Given an array of integers where 1 ≤ a[i] ≤ n (n = size of array), some elements appear twice and others appear once.java

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.app

Example:this

 
 
 
 
 
Input: [4,3,2,7,8,2,3,1] Output: [5,6]

給出一個整數數組nums,數組中每一個元素的取值範圍爲[1,nums.length],有的元素會出現兩次,有的出現一次。要求返回[1,nums.length]範圍中未在數組中出現的數字。spa


解法分析: 在符合條件的數組(連續天然數)中,在數組元素按照從小到大順序排列的狀況下,數組中每項與其鍵的關係爲:i+1=arr[i]。而這個數組是順序無關的,故亂序條件下這個關係依然存在。故對數組進行兩次遍歷,第一次遍歷經過每一項的值按照i+1=arr[i]的關係尋找到該值在排序狀態下對應的鍵,並把該鍵對應的數組項置爲負值。第二次遍歷即可根據每一項是否爲負值得出結果,若爲非負值,說明該鍵值+1的值在原數組中未出現。code

function findDisappearedNumbers(nums) {
    var res = [],
        length = nums.length;
    
    for(var i = 0; i < length;i++){
        var m = Math.abs(nums[i]) - 1;  //這裏須取絕對值,由於在以前的操做中這裏可能已經被置爲負值,這裏判斷須要按照原值進行。
        nums[m] = nums[m] > 0 ? -nums[m] : nums[m];
    }
    for(var j = 0;j < length;j++){
        if(nums[j] >= 0) res.push(j + 1);
    }
    
    return res;
};




以前一開始還想了個用字符串解決的辦法,僅供你們一笑。。。。。。
function findDisappearedNumbers(nums) {
    var length = nums.length,
        numStr = ","+ nums.join(",")+",",
        res = [];
        
    for(var i = 1;i <= length;i++){
        if(numStr.indexOf("," + i + ",") == -1)res.push(i);    
    }
    
    return res;
};
相關文章
相關標籤/搜索