这是悦乐书的第200次更新,第209篇原创

01 看题和准备

今天介绍的是LeetCode算法题中Easy级别的第65题(顺位题号是268)。给定一个包含n个不同数字的数组,取自0,1,2,...,n,找到数组中缺少的数字。例如:

输入:[3,0,1]

输出:2

输入:[9,6,4,2,3,5,7,0,1]

输出:8

注意:您的算法应该以线性运行时复杂性运行。 你能用恒定的额外空间复杂度来实现吗?

本次解题使用的开发工具是eclipse,jdk使用的版本是1.8,环境是win7 64位系统,使用Java语言编写和测试。

02 第一种解法

特殊情况:当nums为null的时候,或者nums中没有元素的时候,直接返回0即可。

正常情况:缺失的数字分为三种情况:一是缺失的数字在中间,比如{0,1,2,4},此时缺失的数字是3;二是缺失的数字在末尾,比如{0,1,2,3},此时缺失的数字就是4;三是缺失的数字在头部,比如{1,2,3,4},此时缺失的数字就是0。

先将数组从小到大排序,然后使用for循环,判断索引是否相等,不相等就是中间缺失的那个数,如果中间不缺数,最后返回索引即可,因为已经在循环体中自加1,最后返回的时候不用再加1。

此解法时间复杂度是O(nlog(n)),空间复杂度是O(1)

public int missingNumber(int[] nums) {
if (nums == null || nums.length < 1) {
return 0;
}
Arrays.sort(nums);
int index;
for (index = 0; index < nums.length; index++) {
if (index != nums[index]) {
return index;
}
}
return index;
}

03 第二种解法

通过观察,我们可以发现,nums中的元素组成是一个以1为等差的等差数列,我们可以通过等差数列的和来找出缺失的元素,其求和公式为:

Sum = n*(A1+An)/2

题目中的数组是从0开始到n,即A1=0,An=n-1,我们计算的时候可以从1到数组长度,即A1=1,An=n,然后对其求和,借助for循环,此处有两种方式,一是用和去减每一个元素,最后剩下的就是缺失的元素;二是算出数组所有元素的和,再算等差数列的和与其的差值,就是缺失的元素。

此解法的时间复杂度是O(n),空间复杂度是O(1)

public int missingNumber2(int[] nums) {
if (nums == null || nums.length < 1) {
return 0;
}
int sum = (nums.length*(1+nums.length))/2;
for (int n : nums) {
sum -= n;
}
return sum;
}

04 第三种解法

借助位运算中的异或(^)运算,通过一个运算公式:a^b^b = a,我们可以算出缺失的那个数字。例如:

数组nums={0,1,2,4},数组的索引是{0,1,2,3}

missing=4^(0^0)^(1^1)^(2^2)^(4^3)

       =3^(0^0)^(1^1)^(2^2)^(4^4)

       =3

其中最开始的4就是数组的长度。

此解法的时间复杂度是O(n),空间复杂度是O(1)

public int missingNumber3(int[] nums) {
if (nums == null || nums.length < 1) {
return 0;
}
int xor = nums.length;
for (int i = 0; i < nums.length; i ++) {
xor = xor ^ nums[i] ^ i;
}
return xor;
}

05 第四种解法

使用HashSet,先将数组中的每一个元素存入其中,然后利用for循环,从0到n,判断set中是否包含当前索引,不包含的就是缺失的那个数。

此解法也可以用HashMap做,思路都是一样的,时间复杂度是O(n),空间复杂度是O(n)

public int missingNumber4(int[] nums) {
if (nums == null || nums.length < 1) {
return 0;
}
Set<Integer> set = new HashSet<>();
for (int num : nums) {
set.add(num);
}
for (int i=0; i<=nums.length; i++) {
if (!set.contains(i)) {
return i;
}
}
return -1;
}

06 小结

算法专题目前已连续日更超过一个月,算法题文章65+篇,公众号对话框回复【数据结构与算法】、【算法】、【数据结构】中的任一关键词,获取系列文章合集。

以上就是全部内容,如果大家有什么好的解法思路、建议或者其他问题,可以下方留言交流,点赞、留言、转发就是对我最大的回报和支持!

LeetCode算法题-Missing Number(Java实现-四种解法)的更多相关文章

  1. LeetCode算法题-Third Maximum Number(Java实现-四种解法)

    这是悦乐书的第222次更新,第235篇原创 01 看题和准备 今天介绍的是LeetCode算法题中Easy级别的第89题(顺位题号是414).给定非空的整数数组,返回此数组中的第三个最大数字.如果不存 ...

  2. LeetCode算法题-Ugly Number(Java实现-四种解法)

    这是悦乐书的第199次更新,第208篇原创 01 看题和准备 今天介绍的是LeetCode算法题中Easy级别的第64题(顺位题号是263).编写一个程序来检查给定的数字是否是一个丑陋的数字.丑陋的数 ...

  3. LeetCode算法题-Minimum Distance Between BST Nodes(Java实现-四种解法)

    这是悦乐书的第314次更新,第335篇原创 01 看题和准备 今天介绍的是LeetCode算法题中Easy级别的第183题(顺位题号是783).给定具有根节点值的二叉搜索树(BST),返回树中任何两个 ...

  4. LeetCode算法题-Binary Number with Alternating Bits(Java实现)

    这是悦乐书的第292次更新,第310篇原创 01 看题和准备 今天介绍的是LeetCode算法题中Easy级别的第160题(顺位题号是693).给定正整数,检查它是否具有交替位:即它的二进制数的任意两 ...

  5. LeetCode算法题-Perfect Number(Java实现)

    这是悦乐书的第249次更新,第262篇原创 01 看题和准备 今天介绍的是LeetCode算法题中Easy级别的第116题(顺位题号是507).我们定义Perfect Number是一个正整数,它等于 ...

  6. LeetCode算法题-Valid Perfect Square(Java实现-四种解法)

    这是悦乐书的第209次更新,第221篇原创 01 看题和准备 今天介绍的是LeetCode算法题中Easy级别的第77题(顺位题号是367).给定正整数num,写一个函数,如果num是一个完美的正方形 ...

  7. LeetCode算法题-Intersection of Two Arrays(Java实现-四种解法)

    这是悦乐书的第207次更新,第219篇原创 01 看题和准备 今天介绍的是LeetCode算法题中Easy级别的第75题(顺位题号是349).给定两个数组,编写一个函数来计算它们的交集.例如: 输入: ...

  8. LeetCode算法题-Reverse Vowels of a String(Java实现-四种解法)

    这是悦乐书的第206次更新,第218篇原创 01 看题和准备 今天介绍的是LeetCode算法题中Easy级别的第74题(顺位题号是345).编写一个函数,它将一个字符串作为输入,并仅反转一个字符串的 ...

  9. LeetCode算法题-Happy Number(Java实现)

    这是悦乐书的第188次更新,第190篇原创 01 看题和准备 今天介绍的是LeetCode算法题中Easy级别的第47题(顺位题号是202).编写算法以确定数字是否"幸福". 幸福 ...

随机推荐

  1. Swagger中配置了@ApiModelProperty的allowableValues属性但不显示的问题

    现在用Swagger来生成API文档的例子已经非常多了,今天碰到开发同事问了一个问题,帮着看了一下,主要还是配置方法的问题,所以记录一下.如果您也碰到了同样的问题,希望本文对您有用. 问题描述 @Ap ...

  2. [转]php中 curl模拟post发送json并接收json

    本文转自:https://blog.csdn.net/pangchengyong0724/article/details/52103962 本地模拟请求服务器数据,请求数据格式为json,服务器返回数 ...

  3. Try Catch 嵌套问题

    程序错误 问题描述: 在一个事物中,插入两张表数据,但是第一个成功,第二个失败了,没有起到所谓的事物的功能,这让我百思不得其解 问题所在: 本质上其实报错了,但是错误被吃掉了,具体来说,就是 try ...

  4. 使用PoolingHttpClientConnectionManager解决友盟(umeng)推送在多线程环境推送失败的问题

    在友盟(umeng)提供的服务端推送的sdk中,使用的是apache提供的httpclient.在单线程化境下,httpclient工作没有问题.但是由于umeng的sdk中并未考虑并发的情况,因此很 ...

  5. dll 已注册 检索 COM 类工厂中 CLSID 为 {XXXX-XXXX-XXX-XXXXX-XXX} 的组件时失败,原因是出现以下错误: 80040154。

    前几天碰到的问题,错误提示“ 检索 COM 类工厂中 CLSID 为 {XXXX-XXXX-XXX-XXXXX-XXX} 的组件时失败,原因是出现以下错误: 80040154.”,然而dll已注册,注 ...

  6. sudo: cd: command not found

    事件起因 今天在aws ubutun上忽然发现的一个问题,执行sudo cd 时出现 sudo: cd: command not found 原因 shell shell是一个命令解析器 所谓shel ...

  7. oracle中rownum的使用

    rownum是系统的一个关键字,表示行号,是系统自动分配的,第一条符合要求的数据行号就是1,第二条符合要求的数据行号就是2. Rownum 不能直接使用 例:取前多少条数据: 取中间的一些数据: se ...

  8. Flask 系列之 Bootstrap-Flask

    说明 操作系统:Windows 10 Python 版本:3.7x 虚拟环境管理器:virtualenv 代码编辑器:VS Code 实验目标 通过使用 Bootstrap-Flask 来进行页面美化 ...

  9. 弹性盒模型flex

    一.flex flex是flexible box的缩写,意为“弹性布局”: 定义弹性布局 display:flex; box{ display:flex; } 二.基本定义 我只简单的说一下容器和项目 ...

  10. 洛谷P4589 [TJOI2018]智力竞赛(二分答案 二分图匹配)

    题意 题目链接 给出一个带权有向图,选出n + 1n+1条链,问能否全部点覆盖,如果不能,问不能覆盖的点权最小值最大是多少 Sol TJOI怎么净出板子题 二分答案之后直接二分图匹配check一下. ...