Missing Number 三种解法
2016-05-09 20:09
267 查看
题目链接:https://leetcode.com/problems/missing-number/
解法1)根据不缺失情况下的数字和-缺失情况下的数字和就是缺失的数字,代码如下:
解法2)使用异或来解决,首先1~n先进行一次异或,然后对数组中的数字再异或一次,由于a^a得到的是0,因此有一个数字在异或过程中无法消除,该数字即为缺失的数字,代码如下:
解法3)使用二分搜索,但是本题的要求是O(n)的时间复杂度,不符合要求,但是如果数组已经是有序的,则二分搜索将成为最好的算法,代码如下:
解法1)根据不缺失情况下的数字和-缺失情况下的数字和就是缺失的数字,代码如下:
class Solution { public: int missingNumber(vector<int>& nums) { int n = nums.size(); int sum = 0; for(int i=0; i<n; ++i) { sum += nums[i]; } int total = 0; for(int i=0; i<=n; ++i) { total += i; } return total - sum; } };
解法2)使用异或来解决,首先1~n先进行一次异或,然后对数组中的数字再异或一次,由于a^a得到的是0,因此有一个数字在异或过程中无法消除,该数字即为缺失的数字,代码如下:
class Solution { public: int missingNumber(vector<int>& nums) { int n = nums.size(); int res = 0; for(int i=0; i<=n; ++i) { if(i != n) { res ^= nums[i]; } res ^= i; } return res; } };
解法3)使用二分搜索,但是本题的要求是O(n)的时间复杂度,不符合要求,但是如果数组已经是有序的,则二分搜索将成为最好的算法,代码如下:
class Solution { public: int missingNumber(vector<int>& nums) { sort(nums.begin(), nums.end()); int l = 0; int r = nums.size() - 1; while(l < r) { int m = l + ((r - l) >> 1); if(nums[m] == m) { l = m + 1; } else { r = m - 1; } } int res = l == nums[l] ? l + 1 : l; // 如果是l == nums[l] 说明缺少的是最后一个数字 return res; } };
相关文章推荐
- kmp算法
- [bzoj3052][WC2013]糖果公园
- Spring源码解析—— ClassPathResource类
- 图像处理的仿射变换和透视变换
- Spring源码解析—— ClassPathResource类
- android 编写拦截拦截短信的service
- 自学android, java, html, css, php, mysql, javascript路线
- 冒泡排序的两种写法
- 在Linux防火墙上过滤外来的ICMP timestamp
- 机器学习 : 高斯混合模型及EM算法
- 编程之美之买书
- 垃圾回收之引用计数之循环引用
- 初学Shiro
- MagicalRecord(简化CoreData操作)
- PAT 乙级 1007. 素数对猜想 (20)
- 一个图书售卖网页
- nyoj 123 士兵杀敌(四)
- Codeforces Round #151 (Div. 2) C. Beauty Pageant
- 给VirtualBox上的Ubuntu虚拟机扩展硬盘空间
- 第十一周【项目1 - 点-圆-圆柱类族的设计2】