内容简介:本文首发于公众号「五分钟学算法」,是个人网站:www.cxyxiaowu.com今天分享一道很简单的算法题。
本文首发于公众号「五分钟学算法」,是 图解 LeetCode 系列文章之一。
个人网站:www.cxyxiaowu.com
今天分享一道很简单的算法题。
题目来源于 LeetCode 上第 268 号问题:缺失数字。题目难度为 Easy,目前通过率为 50.2% 。
题目描述
给定一个包含 0, 1, 2, ..., n
中 n 个数的序列,找出 0 .. n 中没有出现在序列中的那个数。
说明:
你的算法应该具有线性时间复杂度。 你可以不使用额外空间来实现吗?
题目解析
这道题目有三种解法。
解法一:异或法
和之前那道 只出现一次的数字 很类似:
只出现一次的数字: 给定一个 非空 整数数组,除了某个元素只出现一次以外,其余每个元素均出现两次。找出那个只出现了一次的元素。
如果我们补充一个完整的数组和原数组进行组合,那所求解的问题就变成了 只出现一次的数字 。
将少了一个数的数组与 0 到 n 之间完整的那个数组进行异或处理,因为相同的数字异或会变为了 0 ,那么全部数字异或后,剩下的就是少了的那个数字。
代码实现1
class Solution { public int missingNumber(int[] nums) { int res = 0; //注意数组越界情况 for (int i = 0; i < nums.length;i++){ // i 表示完整数组中的数字,与原数组中的数字 nums[i] 进行异或,再与保存的结果异或 res = res^i^nums[i]; } //最后需要与循环中无法使用到的那个最大的数异或 return res^i; } } 复制代码
代码实现2
class Solution { public int missingNumber(int[] nums) { int res = nums.length; for (int i = 0; i < nums.length; ++i){ res ^= nums[i]; res ^= i; } return res; } } 复制代码
解法二:求和法
- 求出 0 到 n 之间所有的数字之和
- 遍历数组计算出原始数组中数字的累积和
- 两和相减,差值就是丢失的那个数字
//小吴之前担心会数据溢出,不过估计这题考察的不是这个,所以测试用例没写这种吧,还是能 AC 的 class Solution { public int missingNumber(int[] nums) { int n = nums.length; int sum = (n+0)*(n+1)/2; for (int i=0; i<n; i++){ sum -= nums[i]; } return sum; } } 复制代码
解法三:二分法
将数组进行 排序 后,利用二分查找的方法来找到缺少的数字,注意搜索的范围为 0 到 n 。
- 首先对数组进行排序
- 用元素值和下标值之间做对比,如果元素值大于下标值,则说明缺失的数字在左边,此时将 right 赋为 mid ,反之则将 left 赋为 mid + 1 。
注:由于一开始进行了排序操作,因此使用二分法的性能是不如上面两种方法。
public class Solution { public int missingNumber(int[] nums) { Arrays.sort(nums); int left = 0; int right = nums.length; while (left < right){ int mid = (left + right) / 2; if (nums[mid] > mid){ right = mid; }else{ left = mid + 1; } } return left; } } 复制代码
以上就是本文的全部内容,希望本文的内容对大家的学习或者工作能带来一定的帮助,也希望大家多多支持 码农网
猜你喜欢:- 通俗易懂--决策树算法、随机森林算法讲解(算法+案例)
- 限流算法之漏桶算法、令牌桶算法
- 什么是Paxos算法?Paxos算法是区块链核心算法之一
- 一文读懂对称加密算法、非对称加密算法和Hash算法
- 算法(六):图解贪婪算法
- 算法篇03:排序算法
本站部分资源来源于网络,本站转载出于传递更多信息之目的,版权归原作者或者来源机构所有,如转载稿涉及版权问题,请联系我们。
JavaScript
David Flanagan / O'Reilly Media / 2011-5-13 / GBP 39.99
The book is a programmer's guide and comprehensive reference to the core JavaScript language and to the client-side JavaScript APIs defined by web browsers. The sixth edition covers HTML 5 and ECMA......一起来看看 《JavaScript》 这本书的介绍吧!