您的位置:首页 > 其它

268. Missing Number

2016-05-18 13:01 363 查看
题目:

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?
题意:
给定一个数组,找出给定数组中漏掉的值。

note:你的算法需要花费线性时间复杂度。且使用常数个额外的空间复杂度。

思路一:

正常的数组值与下标相等。利用异或操作找出不相同的元素。 数组无序。。。。。。。。

代码:40ms

class Solution {
public:
    int missingNumber(vector<int>& nums) {
        
        for(int i = 0; i < nums.size(); i++)
        {
            while(i < nums.size() && nums[i] == i) i++;
            while(i < nums.size() && nums[i] != i)
            {
                if(nums[i] >= nums.size() || nums[i] < 0) break;
                nums[i] = nums[i] ^ nums[nums[i]] ^ (nums[nums[i]] = nums[i]);
            }
        }
        for(int i = 0; i < nums.size(); i++)
            if(nums[i] != i) return i;
        return nums.size();
    }
};
代码:36ms

class Solution {
public:
    int missingNumber(vector<int>& nums) {
        
        int result = nums.size();
        for(int i=0; i<nums.size(); i++){
            result ^= nums[i] ^ i;
        }
        
        return result;
    }
};
思路二:

先算出正常情况下数组所有元素之和为多少,之后利用总和减去数组中的每一个元素,剩下的就为缺失的元素。

代码:36ms

class Solution {
public:
    int missingNumber(vector<int>& nums) {
        
        int result = nums.size() * (nums.size() + 1)/2;
        for(int i=0; i<nums.size(); i++){
            result -= nums[i];
        }
        
        return result;
    }
};
思路三:

从缺失的元素之后,数组元素下标与元素值不再相等,元素值大于下标值,只需要找到第一个下标值与元素值不相等的元素记录下来即可。

代码:36ms

class Solution {
public:
    int missingNumber(vector<int>& nums) {
        
        int pre = -1;
        int cur = 0;
        int size = nums.size();
        
        while(cur<size){
            if(nums[cur]!=cur){
                if(nums[cur]!=size){
                    swap(nums[cur], nums[nums[cur]]);
                }else{
                    pre = cur;
                    cur++;
                }
            }else{
                cur++;
            }
        }
        
        return pre == -1 ? size : pre;
    }
};
转载地址:https://leetcode.com/discuss/54454/swapping-numbers-to-the-same-index-cell
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: