【LeetCode】645. Set Mismatch

The set S originally contains numbers from 1 to n. But unfortunately, due to the data error, one of the numbers in the set got duplicated to another number in the set, which results in repetition of one number and loss of another number.

Given an array nums representing the data status of this set after the error. Your task is to firstly find the number occurs twice and then find the number that is missing. Return them in the form of an array.

Example 1:
Input: nums = [1,2,2,4]
Output: [2,3]

Note:
The given array size will in the range [2, 10000].
The given array’s numbers won’t have any order.
求1-n中 重复的和缺少的一个数。
方法1,很容易想到。

class Solution {
public:
    int a[10001];
    vector<int> findErrorNums(vector<int>& nums) {
        int n=nums.size();
        for(int i=0;i<n;i++)a[nums[i]]++;
        vector<int> ans;
        for(int i=1;i<=n;i++){
            if(a[i]==2)ans.push_back(i);
        }
        for(int i=1;i<=n;i++){
            if(a[i]==0)ans.push_back(i);
        }
        return ans;
    }
};

然而这种需要额外的开辟0(N)的空间,应该进行优化。
方法2:
利用原有的数组,数字出现过就把对应的位置数字变成负数。
最后还是正数的就是缺少的数字。

class Solution {
public:
    vector<int> findErrorNums(vector<int>& nums) {
        int n=nums.size();
        vector<int> ans;
        for(int i=0;i<n;i++){
            int t=abs(nums[i])-1;
            if(nums[t]>0){
                nums[t]*=-1;
            }else{
                ans.push_back(t+1);
            }
        }
        for(int i=0;i<n;i++){
            if(nums[i]>0){
                ans.push_back(i+1);
                break;
            }
        }
        return ans;
    }
};

猜你喜欢

转载自blog.csdn.net/a342500329a/article/details/77691907
今日推荐