C ++中带有难看数字的子数组的最大长度

问题陈述

给定一个由N个元素组成的数组arr [](0≤arr [i]≤1000)。任务是找到仅包含丑陋数字的子数组的最大长度。

丑数是仅素数为2、3或5的数。

下面的示例是系列中的几个数字:1、2、3、4、5、6、8、9、10、12、15,…

示例

如果输入数组为{1、2、7、9、120、810、374},则答案为3,如-

丑数sis {9,120,810}的可能的最长子数组

算法

  • 取一个unordered_set,然后在集合中插入所有小于1000的丑陋数字

  • 使用两个名为current_max和max_so_far的变量遍历数组。

  • 检查集中是否存在每个元素

  • 如果找到一个丑陋的数字,则增加current_max并将其与max_so_far进行比较

  • 如果current_max> max_so_far,则max_so_far = current_max。

  • 每次发现不难看的元素时,请重置current_max = 0。

示例

#include <bits/stdc++.h>
using namespace std;
unsigned getUglyNumbers(int n) {
   int ugly[n];
   int i2 = 0, i3 = 0, i5 = 0;
   int next_multiple_of_2 = 2;
   int next_multiple_of_3 = 3;
   int next_multiple_of_5 = 5;
   int next_ugly_no = 1;
   ugly[0] = 1;
   for (int i = 1; i < n; i++) {
      next_ugly_no = min(next_multiple_of_2, min(next_multiple_of_3, next_multiple_of_5));
      ugly[i] = next_ugly_no;
      if (next_ugly_no == next_multiple_of_2) {
         i2 = i2 + 1;
         next_multiple_of_2 = ugly[i2] * 2;
      }
      if (next_ugly_no == next_multiple_of_3) {
         i3 = i3 + 1;
         next_multiple_of_3 = ugly[i3] * 3;
      }
      if (next_ugly_no == next_multiple_of_5) {
         i5 = i5 + 1;
         next_multiple_of_5 = ugly[i5] * 5;
      }
   }
   return next_ugly_no;
}
int maxUglySubarray(int arr[], int n) {
   unordered_set<int> s;
   int i = 1;
   while (1) {
      int next_ugly_number = getUglyNumbers(i);
      if (next_ugly_number > 1000)
         break;
      s.insert(next_ugly_number);
      i++;
   }
   int current_max = 0, max_so_far = 0;
   for (int i = 0; i < n; i++) {
      if (s.find(arr[i]) == s.end())
         current_max = 0;
      else {
         current_max++;
         max_so_far = max(current_max,
         max_so_far);
      }
   }
   return max_so_far;
}
int main() {
   int arr[] = {1, 2, 7, 9, 120, 810, 374};
   int n = sizeof(arr) / sizeof(arr[0]);
   cout << "Maximum sub-array size of consecutive ugly numbers = " << maxUglySubarray(arr, n) << endl;
   return 0;
}

输出结果

当您编译并执行上述程序时。它产生以下输出-

Maximum sub-array size of consecutive ugly numbers = 3