在C ++中的连续数字排序数组中查找丢失的元素

概念

对于n个不同整数的给定array array [],将元素按升序顺序放置,其中一个缺少元素。我们的任务是确定缺少的元素。

输入值

array[] = {1, 2, 3, 4, 5, 6, 7, 9}

输出结果

8

输入值

array[] = {-4, -2, -1, 0, 1, 2}

输出结果

-3

输入值

array[] = {1, 2, 3, 4}

输出结果

-1

没有元素丢失。

方法

原则

  • 寻找不一致性:根据此原理,每个元素及其索引之间的差必须为array [0]。

例,

A [] = {1,2,3,4,5}->一致

B [] = {201,202,203,204}->一致

C [] = {1,2,3,5,6}->与C [3] – 3!= C [0]不一致,即5 – 3!= 1

  • 确定不一致有助于每次仅以O(logN)扫描数组的一半。

算法

  • 确定中间元素并验证其是否一致。

  • 如果中间元素是一致的,则验证中间元素与其下一个元素之间的差是否大于1,即验证array [mid + 1] – array [mid]> 1

    • 如果是,则array [mid] +1是缺少的元素。

    • 否则,我们必须从中间元素扫描右边的一半数组,然后跳到步骤1。

  • 如果中间元素不一致,则验证中间元素与其前一个元素之间的差是否大于1,即验证array [mid] – array [mid – 1]> 1

    • 如果是,则array [mid] – 1是缺少的元素。

    • 否则,我们必须扫描中间元素的左半部分数组,然后跳至步骤1。

示例

// CPP implementation of the approach

#include<bits/stdc++.h>

using namespace std;

//显示函数以返回缺少的元素

int findMissing(int array[], int n1){

   int low = 0, high = n1 - 1;

   int mid1;

   while (high > low){

      mid1 = low + (high - low) / 2;

      //验证中间元素是否一致

      if (array[mid1] - mid1 == array[0]){

         //在这里,直到中间元素没有矛盾

         //当缺少元素在

         //中间元素

         if (array[mid1 + 1] - array[mid1] > 1)

            return array[mid1] + 1;

         else{

            //往右走

            low = mid1 + 1;

         }

      }

      else{

         //在这里发现不一致

         //当缺少元素在之前

         //中间元素

         if (array[mid1] - array[mid1 - 1] > 1)

            return array[mid1] - 1;

         else{

            //向左走

            high = mid1 - 1;

         }

      }

   }

   //在这里,找不到丢失的元素

   return -1;

}

//驱动程式码

int main(){

   int array[] = { -9, -8, -6, -5, -4, -3, -2, -1, 0 };

   int n1 = sizeof(array)/sizeof(array[0]);

   cout <<"缺少的元素:" <<(findMissing(array, n1));

}

输出结果

缺少的元素:-7

以上是 在C ++中的连续数字排序数组中查找丢失的元素 的全部内容, 来源链接: utcz.com/z/321786.html

回到顶部