LeetCode之剑指Offer - II. 0~n-1中缺失的数字(53)

举报
liuzhen007 发表于 2021/05/26 17:19:04 2021/05/26
【摘要】 目录   题目 解题 方法一、直接法 方法二、位运算 题目 (原题链接:https://leetcode-cn.com/problems/que-shi-de-shu-zi-lcof/) 一个长度为n-1的递增排序数组中的所有数字都是唯一的,并且每个数字都在范围0~n-1之内。在范围0~n-1内的n个数字中有且只有一个数字不在该数组中,请找出这个数...

目录

 

题目

解题

方法一、直接法

方法二、位运算


题目

(原题链接:https://leetcode-cn.com/problems/que-shi-de-shu-zi-lcof/

一个长度为n-1的递增排序数组中的所有数字都是唯一的,并且每个数字都在范围0~n-1之内。在范围0~n-1内的n个数字中有且只有一个数字不在该数组中,请找出这个数字。

示例 1:

输入: [0,1,3]
输出: 2

示例 2:

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

解题

方法一、直接法

分析:根据题意,答案有三种情况,1)数组从1开始,那么答案数是0;2)答案数在数组中,即大于nums[0]且小于nums[nums.size()-1];3)答案数在数组外,即大于nums[nums.size()-1]。所以直接编码即可,看下边代码。

代码:(C++)


  
  1. class Solution {
  2. public:
  3. int missingNumber(vector<int>& nums) {
  4. if (nums[0] == 1) return 0;
  5. for(int i = 1; i < nums.size(); i++) {
  6. if (nums[i] == nums[i-1] + 1) {
  7. continue;
  8. } else {
  9. return nums[i] - 1;
  10. }
  11. }
  12. return nums.size();
  13. }
  14. };

时间复杂度:O(n)。

空间复杂度:O(1)。

执行结果:

方法二、位运算

分析:利用位运算异或的特性,两个相同的数异或为0,所以思路就是先遍历 0 ~ n-1 所有数,进行异或运算,然后遍历数组元素,利用上一步骤的结果进行异或运算,本题中不存在的那个数最后就会被剩下,也就是结果。

代码:(C++)


  
  1. class Solution {
  2. public:
  3. int missingNumber(vector<int>& nums) {
  4. int n = nums.size();
  5. int bit = 0;
  6. for (int i = 0; i <= n; i++){
  7. bit^=i;
  8. }
  9. for (int x : nums) {
  10. bit^=x;
  11. }
  12. return bit;
  13. }
  14. };

时间复杂度:O(n)。

空间复杂度:O(1)。

执行结果:

 

 如果有疑问,欢迎评论留言或者私信沟通! 

文章来源: liuzhen.blog.csdn.net,作者:Data-Mining,版权归原作者所有,如需转载,请联系作者。

原文链接:liuzhen.blog.csdn.net/article/details/107924843

【版权声明】本文为华为云社区用户转载文章,如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。