当前位置: 首页 > news >正文

数据结构 ——— 数组 nums 包含了从 0 到 n 的所有整数,但是其中缺失了一个,请编写代码找出缺失的整数,并且在O(N)时间内完成

目录

题目要求

代码实现

方法1(异或法):

异或算法的时间复杂度:

方法2(等差数列公式):

等差数列公式的时间复杂度:


题目要求

整型数组 nums 包含了从 0 到 n 的所有整数,但是其中缺失了一个,编写一个 missingNumber 函数,找出缺失的整数,并且将 missingNumber 函数的时间复杂度控制在 O(N) 内完成‘

nums 为:整型数组首元素地址

numsSize 为:nums 数组的元素个数


代码实现

方法1(异或法):

代码演示:

int missingNumber(int* nums, int numsSize)
{int x = 0;// 循环1for (int i = 0; i < numsSize; i++){x = x ^ nums[i];}// 循环2for (int i = 0; i < numsSize + 1; i++){x = x ^ i;}return x;
}

代码解析:

0 异或任何整数,结果为任何整数

0 ^ x = x

两个相同的整数异或,结果为0

a ^ a = 0

两个相同的整数异或 再 异或一个其他的整数,结果为其他的整数,且异或满足交换律

a ^ a ^ b = b   <===>   a ^ b ^ a = b

由以上的结论推导出代码的含义:

创建整型变量 x 并赋值为 0 ,因为 0 异或任何整数,结果为任何整数,所以再使用 x 异或 nums 数组中的所有整数,再利用 numsSize 遍历完整的 nums 数组,再和 x 异或,异或完之后的 x 就是缺失的那个值

举例说明:

nums 的元素为:[0, 1, 2, 3, 5]

x 为:0

循环1 为:0 ^ 1 ^ 2 ^ 3 ^ 5

循环2 为:0 ^ 1 ^ 2 ^ 3 ^ 4 ^ 5

由以上的代码得:

    0 ^ 0 ^ 1 ^ 2 ^ 3 ^ 5 ^ 0 ^ 1 ^ 2 ^ 3 ^ 4 ^ 5

=  0 ^ 0 ^ 0 ^ 1 ^ 1 ^ 2 ^ 2 ^ 3 ^ 3 ^ 5 ^ 5 ^ 4

=  0 ^ 0 ^ 0 ^ 0 ^ 0 ^ 0 ^ 0 ^ 4

=  4

代码验证:

异或算法的时间复杂度:

循环1 执行了 N 次,循环2 执行了 N+1 次

得出算法的时间复杂度函数式:

时间复杂度函数式:F(N) = N + N + 1 = 2 * N + 1

根据时间复杂度函数式和大O的渐进表示法规则得出:只保留最高项(去掉 1);如果最高阶项存在且不是1,则去除与这个项目相乘的常数(除去 F(N) 中的2 ),得出大O的渐进表示法: 

大O渐进表示法:O(N)


方法2(等差数列公式):

代码演示:

int missingNumber(int* nums, int numsSize)
{// 首项加尾项乘以项数除以2int x = (0 + numsSize) * (numsSize + 1) / 2;// 循环1for (int i = 0; i < numsSize; i++){x = x - nums[i];}return x;
}

代码解析:

首项加尾项乘以项数除以2,根据这个公式就能求出完整的 nums 数组的所有数的和并存储到整型变量 x 中

最后再利用 循环1 遍历 nums 数组的中数,并用 x 依次递减,最后 x 的值就是 nums 数组缺失的数

代码验证:

等差数列公式的时间复杂度:

计算等差数列公式执行了1次(常数次),循环1 执行了 N 次

得出算法的时间复杂度函数式:

时间复杂度函数式:F(N) = 1 + N

由时间复杂度函数式直接推导出大O渐进表示法:

大O渐进表示法:O(N)


http://www.mrgr.cn/news/35601.html

相关文章:

  • 丹摩征文活动 | 0基础带你上手经典目标检测模型 Faster-Rcnn
  • MySQL Shell教程
  • 小白NAS磁盘规划实践:一次科学、高效的存储旅程
  • 【C#/C++】C++/CL中String^的含义和举例,C++层需要调用C#层对象时...
  • 算法每日双题精讲——滑动窗口(长度最小的子数组,无重复字符的最长子串)
  • 【Kafka-go】golang的kafka应用
  • 【C++前缀和 状态压缩】1177. 构建回文串检测|1848
  • 车辆识别数据集,图片数量20500,模型已训练200轮
  • C语言 | Leetcode C语言题解之第435题无重叠区间
  • TCP/IP 协议栈
  • 使用TensorFlow实现一个简单的神经网络:从构建到训练
  • 240924-通过服务器代理ip地址及port端口wget等下载文件
  • RT-DETR改进策略:BackBone改进|PoolFormer赋能RT-DETR,视觉检测性能显著提升的创新尝试
  • 在Java中,关于final、static关键字与方法的重写和继承【易错点】
  • 点亮城市安全:高科技助力精准定位路灯漏电‘隐形杀手
  • 2024年CSP-J认证 CCF信息学奥赛C++ 中小学初级组 第一轮真题-阅读程序题解析
  • 实战OpenCV之图像滤波
  • 构建预测睡眠质量模型_相关性分析,多变量分析和聚类分析
  • Cloudflare为网站添加AI审计 可检查AI爬虫何时抓取和抓取频次以及直接屏蔽爬虫
  • 从准备面试八股文,感悟到技术的本质
  • GNU链接器(LD):存储命令(MEMORY)用法及实例解析
  • 公安局软件管理平台建设方案和必要性,论文-3-———未来之窗行业应用跨平台架构
  • Python | Leetcode Python题解之第435题无重叠区间
  • LeetCode从入门到超凡(三)回溯算法
  • 风力发电机叶片表面缺陷识别检测数据集yolo数据集 共7000张
  • Python | Leetcode Python题解之第434题字符串中的单词数