zoukankan      html  css  js  c++  java
  • 645. 错误的集合

    toc

    题目

    集合 s 包含从 1 到 n 的整数。不幸的是,因为数据错误,导致集合里面某一个数字复制了成了集合里面的另外一个数字的值,导致集合 丢失了一个数字 并且 有一个数字重复 。

    给定一个数组 nums 代表了集合 S 发生错误后的结果。

    请你找出重复出现的整数,再找到丢失的整数,将它们以数组的形式返回。

    示例 1:

    输入:nums = [1,2,2,4]
    输出:[2,3]
    示例 2:

    输入:nums = [1,1]
    输出:[1,2]

    提示:

    2 <= nums.length <= 10^4
    1 <= nums[i] <= 10^4

    来源:力扣(LeetCode)
    链接:https://leetcode-cn.com/problems/set-mismatch
    著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。

    O(n)解题思路

    根据题意,nums.length取值范围在2到10^4,量不大,nums[i]取值范围也不大,可以考虑利用额外空间配合下标索引换取时间。nums中元素基本是连续的(不是说有序),额外空间nums.length + 1大小即可
    过程简述:

    • 定义存储flag的向量,输入值会作为此向量的下标
    • 遍历输入,修改下标指向的falg值
    • 发现下标指向的flag值已经被修改时,即找到重复的整数
    • 继续遍历,直到所有输入完成对flag的标记
    • 遍历存储flag的向量,未被标记的下标即为丢失的整数(0处除外)

    代码

    class Solution {
    public:
        vector<int> findErrorNums(vector<int>& nums) {
            int iRepeattion =0, iMissing = 0, ivecFlagSize = nums.size() + 1;
            std::vector<bool> vecFLag(ivecFlagSize, false);
            for(const auto& elem :nums){
                if(vecFLag[elem]){
                    iRepeattion = elem;
                }else{
                    vecFLag[elem] = true;
                }
            }
            for(int i = 1; i < ivecFlagSize; i++){
                if(!vecFLag[i]){
                    iMissing = i;
                    break;
                }
            }
            std::vector<int> vecRet = {iRepeattion, iMissing};
            return vecRet;
        }
    };

    优化

    将vecFLag的bool实例化变为int实例化,原因参看<Effective STL>

    class Solution {
    public:
        vector<int> findErrorNums(vector<int>& nums) {
            int iRepeattion =0, iMissing = 0, ivecFlagSize = nums.size() + 1;
            std::vector<int> vecFLag(ivecFlagSize, 0);
            for(const auto& elem :nums){
                if(1 == vecFLag[elem]){
                    iRepeattion = elem;
                }else{
                    vecFLag[elem] = 1;
                }
            }
            for(int i = 1; i < ivecFlagSize; i++){
                if(0 == vecFLag[i]){
                    iMissing = i;
                    break;
                }
            }
            std::vector<int> vecRet = {iRepeattion, iMissing};
            return vecRet;
        }
    };





    原创不易,转载请注明出处,谢谢
  • 相关阅读:
    27. Remove Element
    列表变成字典
    1. Two Sum
    CVPR2019:What and How Well You Performed? A Multitask Learning Approach to Action Quality Assessment
    959. Regions Cut By Slashes
    118. Pascal's Triangle
    loj3117 IOI2017 接线 wiring 题解
    题解 NOI2019 序列
    题解 省选联考2020 组合数问题
    题解 Educational Codeforces Round 90 (Rated for Div. 2) (CF1373)
  • 原文地址:https://www.cnblogs.com/Keeping-Fit/p/14669038.html
Copyright © 2011-2022 走看看