重生之我是孔乙己——查找数组缺失元素的几种方法

简介: 重生之我是孔乙己——查找数组缺失元素的几种方法

题目


数组nums包含从0到n的所有整数,但其中缺了一个。请编写代码找出那个缺失的整数。你有办法在O(n)时间内完成吗?


示例 1:


输入:[3,0,1]

输出:2

示例 2:


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

输出:8


排序法


第一种方法,需要用到qsort函数,先将数组按从小到大排好序,然后遍历,当下标与该数组元素不相等时,返回这个数组元素的值。


冒泡排序的时间复杂度是o(n^2),而快速排序的时间复杂度是o(n*logn),我们选择效率更优的快速排序。 排序之后我们需要遍历数组,那程序总共需要执行n*logn+n次。


时间复杂度是o(n*logn)。


#include<stdio.h>
#include<stdlib.h>
int cmp(const void* a, const void* b)
{
  return *(int*)a - *(int*)b; //由小到大排序
  //return *(int *)b - *(int *)a; 由大到小排序
}
int missingNumber(int* nums, int NumsSize)
{
  int i;
  qsort(nums, NumsSize, sizeof(nums[0]), cmp);
  for (i = 0; i <=NumsSize; i++)
  {
  if (i != nums[i])
  {
    return i;
  }
  }
  return -1;
}
int main()
{
  int a[] = {7,9,10 ,0,3,4,1,2,5,6};
  if (missingNumber(a, sizeof(a) / sizeof(a[0])) == -1)
  {
  printf("未找到\n");
  }
  else
  printf("%d",missingNumber(a, sizeof(a) / sizeof(a[0])));
  return 0;
}


异或法


异或,这个方法思路类似于之前找单身狗那道题,异或的两个元素相同为0,相异为1。


要注意第二次遍历次数是数组大小加一,原因是要加上缺失的那一个元素。


除了缺失的元素,其余元素异或的结果一定为0,所以第二次异或的结果一定是缺失的元素值。


程序要执行2n次。


时间复杂度:o(n),比第一种效率更高。


#include<stdio.h>
#include<string.h>
int main()
{
  int a[] = { 7,9,10 ,0,3,4,1,2,5,6 };
  int i = 0;
  int x = 0;
  while (i <sizeof(a)/sizeof(a[0]))
  {
  x ^= a[i];
  i++;
  }
  for (i = 1; i <= sizeof(a)/sizeof(a[0]) + 1; i++)
  {
  x ^= i;
  }
  printf("%d", x);
  return 0;
}


最天才的方法


鬼才才能想出来的方法,果然是大道至简!


第一次遍历将整个数组以及缺失的元素加到一起。


第二次遍历将原数组的值挨个减掉,这样最后剩下的值一定就是所缺失的元素。


时间复杂度是惊人的o(n),芜湖,最好使竟是最单纯的,感动了!


c2d2e26a9190d5c71bd36a10c76033a6_dc531c2c349c46bda572e5660d639b0b.jpeg


int missingNumber(int* nums, int numsSize) {
  int sum = 0;
  for (int i = 0; i < numsSize + 1; i++)
  {
  sum += i;
  }
  for (int i = 0; i < numsSize; i++)
  {
  sum -= nums[i];
  }
  return sum;
}

总结

 感谢观看,本文到这里就结束了,如果觉得有帮助,请给文章点个赞吧,让更多的人看到。🌹 🌹 🌹


cad3f4971ac28288f5f73c67c1f7b77b_7673ea0a00c3431893891e0c2913a10e.jpeg


 也欢迎你,关注我。👍 👍 👍


 原创不易,还希望各位大佬支持一下,你们的点赞、收藏和留言对我真的很重要!!!💕 💕 💕 最后,本文仍有许多不足之处,欢迎各位认真读完文章的小伙伴们随时私信交流、批评指正!下期再见。🎉


相关文章
|
6月前
|
JavaScript
怎样才能往元素后面追加元素
怎样才能往元素后面追加元素
61 0
|
6月前
leetcode代码记录(下一个更大元素 II
leetcode代码记录(下一个更大元素 II
24 0
|
6月前
|
索引
leetcode代码记录(下一个更大元素 I
leetcode代码记录(下一个更大元素 I
23 0
|
6月前
【全网最简短代码】筛选出新数组中和旧数组的重复项,并和旧数组合并(往数组追加新的数据对象且去重,合并两个数组不重复数据)
【全网最简短代码】筛选出新数组中和旧数组的重复项,并和旧数组合并(往数组追加新的数据对象且去重,合并两个数组不重复数据)
|
6月前
|
索引
将数组指定索引位置的元素 移动到 目标索引位置,且不改变其他元素原本的顺序,注意这个不是对调元素位置,是移动某一个元素位置不影响其他元素顺(使用场景:拖拽改变数据的顺序,点击上下左右箭头移动元素顺序)
将数组指定索引位置的元素 移动到 目标索引位置,且不改变其他元素原本的顺序,注意这个不是对调元素位置,是移动某一个元素位置不影响其他元素顺(使用场景:拖拽改变数据的顺序,点击上下左右箭头移动元素顺序)
|
11月前
|
算法 测试技术 C#
C++二分查找算法:数组中占绝大多数的元素
C++二分查找算法:数组中占绝大多数的元素
|
算法
【算法挨揍日记】day10——704. 二分查找、34. 在排序数组中查找元素的第一个和最后一个位置
给定一个 n 个元素有序的(升序)整型数组 nums 和一个目标值 target ,写一个函数搜索 nums 中的 target,如果目标值存在返回下标,否则返回 -1。
363 0
1240:查找最接近的元素 2020-12-27
1240:查找最接近的元素 2020-12-27
|
存储 编译器 C语言
想要了解数组吗?进来看看(下)
想要了解数组吗?进来看看(下)
|
存储 C语言 索引
想要了解数组吗?进来看看(上)
想要了解数组吗?进来看看(上)