[LeetCode] 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:

  1. The given array size will in the range [2, 10000].
  2. The given array's numbers won't have any order.

这道题给了我们一个长度为n的数组,说里面的数字是从1到n,但是有一个数字重复出现了一次,从而造成了另一个数字的缺失,让我们找出重复的数字和缺失的数字。那么最直接的一种解法就是统计每个数字出现的次数了,然后再遍历次数数组,如果某个数字出现了两次就是重复数,如果出现了0次,就是缺失数,参见代码如下:

解法一:

class Solution {

public:
    vector<int> findErrorNums(vector<int>& nums) {
        vector<int> res(2, 0), cnt(nums.size(), 0);
        for (int num : nums) ++cnt[num - 1];
        for (int i = 0; i < cnt.size(); ++i) {
            if (res[0] != 0 && res[1] != 0) return res;
            if (cnt[i] == 2) res[0] = i + 1;
            else if (cnt[i] == 0) res[1] = i + 1;
        }
        return res;
    }
};

我们来看一种更省空间的解法,这种解法思路相当巧妙,遍历每个数字,然后将其应该出现的位置上的数字变为其相反数,这样如果我们再变为其相反数之前已经成负数了,说明该数字是重复数,将其将入结果res中,然后再遍历原数组,如果某个位置上的数字为正数,说明该位置对应的数字没有出现过,加入res中即可,参见代码如下:

解法二:

class Solution {

public:
    vector<int> findErrorNums(vector<int>& nums) {
        vector<int> res(2, -1);
        for (int i : nums) {
            if (nums[abs(i) - 1] < 0) res[0] = abs(i);
            else nums[abs(i) - 1] *= -1;
        }
        for (int i = 0; i < nums.size(); ++i) {
            if (nums[i] > 0) res[1] = i + 1;
        }
        return res;
    }
}; 

下面这种方法也很赞,首先我们把乱序的数字放到其正确的位置上,用while循环来不停的放,直到该数字在正确的位置上,那么一旦数组有序了,我们只要从头遍历就能直接找到重复的数字,然后缺失的数字同样也就知道了,参见代码如下:

解法三:

class Solution {

public:
    vector<int> findErrorNums(vector<int>& nums) {
        for (int i = 0; i < nums.size(); ++i) {
            while (nums[i] != nums[nums[i] - 1]) swap(nums[i], nums[nums[i] - 1]);
        }
        for (int i = 0; i < nums.size(); ++i) {
            if (nums[i] != i + 1) return {nums[i], i + 1};
        }
    }
};

参考资料:

https://discuss.leetcode.com/topic/96808/java-o-n-time-o-1-space

https://discuss.leetcode.com/topic/97091/c-6-lines-solution-with-explanation

本文转自博客园Grandyang的博客,原文链接:[LeetCode] Set Mismatch 设置不匹配

,如需转载请自行联系原博主。

时间: 2024-08-03 18:32:21

[LeetCode] Set Mismatch 设置不匹配的相关文章

电脑通过AE导出视频弹出After Effect提示设置不匹配如何解决

  1.在AE中打开设置,点击"视频输出"中的"格式选项"; 2.在"基本视频设置"最后一项"级别"中,选择最高的级别,比如4.0,并点击确定即可.

leetcode 20 Valid Parentheses 括号匹配

Given a string containing just the characters '(', ')', '{', '}', '[' and']', determine if the input string is valid. The brackets must close in the correct order, "()" and "()[]{}" are all valid but "(]" and "([)]"

无线上网安全设置

时下,四五千块钱的笔记本中都已经配备了无线局域网卡,无线路由器的价格也一路走低,200元左右就可以购买一台知名品牌的54Mbps无线路由器了.有了无线路由器之后,在不破坏家庭现有装修格局的情况下就可以享受Internet冲浪的快感,而且可以随处移动,真正实现了在家里随处享受上网冲浪的便捷. 由于家庭无线上网仍然是一个新生事物,很多家庭无线网络用户仅仅停留在使用阶段,对于无线上网的一些安全漏洞尚不得知.经常会听到有用户感叹,家里没有安装无线网络设备,打开笔记本却搜索到了无线上网信号,享受免费上网的

交互设计:用户的信息搜索行为和网站内容匹配

文章描述:四种信息搜索需求并不能体现所有,但是大部分用户搜索行为还是会落在这四种需求之中,所有网站的设计人员,在进行网站的搜索信息架构的时候,应该多多考虑目标用户的信息需求,为每种类型的用户设计不同的信息匹配方式.                   最近在改进网站的搜索系统,不少用户在使用网站的搜索功能时,有些信息无法精确匹配,甚至错误匹配,如某用户想搜索黄山宏村的景点信息,他在搜索框中输入了宏村一词,搜索结果中却呈现了景德镇瑶里古村.出现搜索不匹配  有很多种原因,包括用户的错误输入.网站的

搜索引擎营销利器——广泛匹配的使用及优化

互联网广告正在一步一步的影响着人们的生活习惯,引导着人们的消费行为,甚至在颠覆人们对一些固有观念的看法.广告形式也从开始的以门户广告.邮箱广告为主,逐步发展成今天的以搜索引擎广告(SEM)为普遍选择.由于搜索引擎是互联网时代信息的首选入口,其独特的地位决定在互联网广告细分中,搜索引擎营销拥有最广泛的受众群体.而在搜索引擎广告中,广泛匹配这一独特营销模式又把基于单个关键词购买的广告形式发挥到一个新的高度. 广泛匹配是百度搜索引擎营销的三种匹配模式(精确.短语.广泛)之一.使用广泛匹配,当网民搜索词

Javascript中使用exec进行正则表达式全局匹配时的注意事项_正则表达式

本文就是介绍在使用 Javascript 中使用 exec 进行正则表达式全局匹配时的注意事项. 先看一下常见的用法: 复制代码 代码如下: <script type="text/javascript"> var pattern = /http:\/\/([^\/\s]+)/; alert(pattern.exec('http://www.codebit.cn')); // http://www.codebit.cn,www.codebit.cn alert(pattern

《Adobe After Effects CS6完全剖析》——正确的设置

正确的设置 After Effects包括大量的设置,你必须理解它们,以便可以方便地使用它们.这些设置涉及一些基本的方面,比如怎样处理时间.颜色深度.透明度.像素高宽比和场数据等.它不一定是有趣的,但它是规则的. 项目设置 在Project Settings(项目设置)对话框中(按下Ctrl+Alt+Shift+K/Cmd+Opt+Shift+K组合键可打开它)包括3个基本的区域. Display Style(显示样式)确定了如何显示时间,主要用于确定是以整数(帧数)保存合成的帧计数还是以时间码

《Adobe Premiere Pro CC经典教程(彩色版)》——2.3 设置序列

2.3 设置序列 创建项目之后,会出现一个对话框,提示你为第一个序列设置参数.Premiere Pro 总是会假设你需要至少一个序列,因此当开始新项目时,会提示你创建一个序列.Premiere Pro会对你放置到序列中的视频和音频剪辑进行改编以使它们与序列的设置相匹配.项目中的每一个序列都具有不同的设置,而你希望选择最能够与原始媒体相匹配的设置.这么做能够减少系统播放剪辑时的工作量,提升实时播放性能并获得最好的质量. 如果你在编辑混合媒体格式项目,那么你可能必须注意选择匹配你序例配置的格式.虽然

《Adobe Premiere Pro CC经典教程》——2.3 设置序列

2.3 设置序列 你可能想要创建序列,在其中放置视频剪辑.音频剪辑和图形.Adobe Premiere Pro会改变放置到序列中的视频和音频剪辑,以便它们匹配序列的设置.项目中的每个序列具有不同的设置,你会想要选择与原始媒体尽可能精确匹配的设置.这样做可以减少系统播放剪辑所做的工作,改进实时性能,并提高质量. 2.3.1 创建自动匹配源媒体的序列 如果不确定应选择哪种序列设置,不要担心.Adobe Premiere Pro有一种特殊的快捷方式,可以根据原始媒体创建序列. 提示: 如果添加到序列的