在C ++中从1到N的元素的数组中查找四个缺失的数字

概念

对于给定的唯一整数数组,其中给定数组的每个整数都在[1,N]范围内,数组的大小为(N-4),并且不重复单个元素。因此,数组中缺少从1到N的四个数字。按排序顺序确定4个缺失数字。

输入值

arr[] = {3, 6, 7, 4, 10}

输出结果

1 2 5 8 9

输入值

arr[] = { 2, 8, 4, 13, 6, 11, 9, 5, 10 }

输出结果

1 3 7 12

方法

现在,一个简单的O(N)解决方案是实现大小为N的辅助数组,以指示或标记访问的元素。访问输入数组并指示或标记辅助数组中的元素。最后打印所有未指示或标记的索引。

现在出现的问题是如何用O(1)辅助空间求解?

首先,我们初始化一个长度为4的名为辅助程序的数组,以补偿4个缺失的数字并将其填充为零。之后,我们从i = 0迭代到给定数组的i <length_of_array,并接受第i个元素的绝对值,并将其存储在名为temp的变量中。这一次,我们将验证-

  • 已经看到,如果元素的绝对值小于输入数组的长度,则我们将array [temp]元素乘以-1(以指示或标记被访问的元素)。

  • 已经看到,如果元素的绝对值大于输入数组的长度,则我们将helper [temp%array.length]元素的值设为-1(以指示或标记访问的元素)。

现在,我们遍历输入数组和那些其值仍大于零的索引,然后在输入数组中未遇到那些元素。结果,我们打印出元素大于零的索引的(index + 1)值。

现在,我们将遍历helper数组和那些其值仍大于零的索引,然后在输入数组中未遇到那些元素。结果,我们打印出元素大于零的索引的(index + array.length + 1)值。

示例

// CPP program to find missing 4 elements

//在大小为N的数组中,元素为

//范围从1到N + 4。

#include <bits/stdc++.h>

using namespace std;

//用于查找O(N)时间中缺少的4个数字

//和O(1)辅助空间。

void missing4(int arr1[], int n1){

   //用于跟踪4个可能的数字

   //大于输入数组的长度

   //如果是Java,helper会自动

   //初始化为0。-

   int helper[4];

   //访问输入数组并标记

   //访问元素

   //为负数

   //帮手[]。

   for (int i = 0; i < n1; i++) {

      int temp1 = abs(arr1[i]);

      //已经看到,如果element小于或

      //等于长度,标记其

      //存在于arr1 []

      if (temp1 <= n1)

         arr1[temp1 - 1] *= (-1);

      //指示或标记助手中的存在[]

      else if (temp1 > n1) {

         if (temp1 % n1 != 0)

            helper[temp1 % n1 - 1] = -1;

         else

            helper[(temp1 % n1) + n1 - 1] = -1;

      }

   }

   //用于打印所有存在的元素

   //没有标记。

   for (int i = 0; i < n1; i++)

      if (arr1[i] > 0)

         cout << (i + 1) << " ";

   for (int i = 0; i < 4; i++)

      if (helper[i] >= 0)

         cout << (n1 + i + 1) << " ";

      return;

}

//驱动程式码

int main(){

   int arr1[] = { 2, 8, 4, 13, 6, 11, 9, 5, 10 };

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

   missing4(arr1, n1);

   return 0;

}

输出结果

1 3 7 12

以上是 在C ++中从1到N的元素的数组中查找四个缺失的数字 的全部内容, 来源链接: utcz.com/z/326829.html

回到顶部