LeetCode刷题-消失的两个数字

前言说明

算法学习,日常刷题记录。

题目连接

消失的两个数字

题目内容

给定一个数组,包含从1到N所有的整数,但其中缺了两个数字。你能在O(N)时间内只用O(1)的空间找到它们吗?

以任意顺序返回这两个数字均可。

示例1:

输入: [1]

输出: [2,3]

示例2:

输入: [2,3]

输出: [1,4]

提示:

nums.length <= 30000

分析过程

思路:使用总和累减法,用总和累减法可以找出缺失的一个数字,而这里缺失的是两个数字,那么先用总和累减法找出缺失的两个数字的总和,总和除以2,确定切分的位置,切分为两部分后,两部分各缺失一个数字,第一部分再用总和累减法找出缺失的那个数字,再用原来缺失的两个数字的总和减去找到的这个缺失的数字得到另一个缺失的数字,即可找到缺失的两个数字。

第一步

计算整数范围的长度size,因为是缺失两个数字,所以整数范围的长度是数组长度加2。

计算从1到N的总和sum,总和 = (首项 + 末项) * 数量 / 2。

第二步

遍历数组,使用总和累减法,即用1到N的总和sum逐个减去数组的元素,最后得到缺失的两个数字的总和,这时sum变成缺失的两个数字的总和。

第三步

把缺失的两个数字的总和sum除以2等于mid,因为题目说包含从1到N所有的整数,所以数字不重复,缺失的两个数字一定是一个小于等于mid,另一个大于mid。

为何一个是小于等于mid?因为java中除以2,如果结果是小数,那么会去掉小数点后的位向下转转换。例如:缺失的两个数字是7和8,那么sum=15,15/2=7,这里就出现小于等于mid,而且从这里也可以看出,mid一定落在1到N的整数之间,因为1到N是连续的整数。

所以,数组被mid切分为了两部分,两部分各分布一个缺失的数字。

第四步

计算第一部分的总和sum1,即从1到mid的总和,总和 = (首项 + 末项) * 数量 / 2,这里的首项就是1,末项也是1,数量就是mid,即sum1 = (1 + mid) * mid / 2。

第五步

计算第一部分在数组中的总和sumOfLessMid,通过遍历数组,累加得到,遍历时小于等于mid的数字才是符合条件进行累加的,遍历数组结束后,sumOfLessMid就是第一部分在数组中的总和。

第六步

定义第一部分中缺失的数字为one,定义第二部分中缺失的数字为two。

第一部分中缺失的数字 = 第一部分的总和 - 第一部分在数组中的总和,即one = sum1 - sumOfLessMid。

第一部分中缺失的数字计算出来后,那么用前面缺失的两个数字的总和sum减去第一部分中缺失的数字one,就算出了第二部分中缺失的数字two。

第二部分中缺失的数字 = 缺失的两个数字的总和 - 第一部分中缺失的数字,即two = sum - one。

最后返回两个缺失的数字one和two组成的数组。

解答代码

class Solution {
    public int[] missingTwo(int[] nums) {
        // 思路:总和累减法,用总和累减法可以找出缺失的一个数字,而这里缺失的是两个数字,那么先用总和累减法找出缺失的两个数字的总和,总和除以2,确定切分的位置,切分为两部分后,两部分各缺失一个数字,第一部分再用总和累减法找出缺失的那个数字,再用原来缺失的两个数字的总和减去找到的这个缺失的数字得到另一个缺失的数字,即可找到缺失的两个数字,不过这种方法先要保证不能总和不能溢出

        // 定义整数长度,因为缺失两个数字,所以整数范围是数组长度加2
        int size = nums.length + 2;

        // 计算从1到n的总和,总和=(首项+末项)*数量/2
        int sum = (1 + size) * size / 2;

        // 遍历数组,总和累减数组的整数,最后得到缺失的两个数字的总和
        for (int num : nums) {
            sum -= num;
        }

        // 这时sum变成缺失的两个数字的总和

        // 缺失的两个数字的总和除以2,因为数字不重复,所以缺失的两个数字一个小于等于mid,另一个大于mid
        int mid = sum / 2;

        // 数组被切分为了两部分,两部分各分布一个缺失的数字

        // 计算第一部分的总和,即从1到mid的总和,总和=(首项+末项)*数量/2
        int sum1 = (1 + mid) * mid / 2;

        // 定义第一部分在数组中的总和
        int sumOfLessMid = 0;

        // 遍历数组,累加得到第一部分在数组中的总和
        for (int num : nums) {
            if (num <= mid) {
                // 小于等于mid的数字是符合条件的
                sumOfLessMid += num;
            }
        }

        // 第一部分中缺失的数字=第一部分的总和-第一部分在数组中的总和
        int one = sum1 - sumOfLessMid;
        // 第二部分中缺失的数字=缺失的两个数字的总和-第一部分中缺失的数字
        int two = sum - one;

        // 返回两个缺失的数字组成的数组
        return new int[]{one,two};
    }
}

提交结果

执行用时1ms,时间击败100.00%的用户,内存消耗39.9MB,空间击败61.54%的用户。

运行结果

原文链接

原文链接:消失的两个数字

?著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 214,172评论 6 493
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 91,346评论 3 389
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事?!?“怎么了?”我有些...
    开封第一讲书人阅读 159,788评论 0 349
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 57,299评论 1 288
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 66,409评论 6 386
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 50,467评论 1 292
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 39,476评论 3 412
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 38,262评论 0 269
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 44,699评论 1 307
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 36,994评论 2 328
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 39,167评论 1 343
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 34,827评论 4 337
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 40,499评论 3 322
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,149评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,387评论 1 267
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 47,028评论 2 365
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 44,055评论 2 352

推荐阅读更多精彩内容