当前位置: 首页 > 知识库问答 >
问题:

寻找包含数组/向量所有元素的最小子数组长度的算法

陈泰宁
2023-03-14

假设我们有一个数组 {7, 3, 7, 3, 1, 3, 4, 1}。我需要的是一个算法(最好是一些 C 代码示例),它将返回包含数组所有元素的最小子数组的长度。

在这种情况下,它将是 5:{7, 3, 1, 3, 4},这是原始数组的最短子数组,其中包含数组的所有元素,即 1、3、4 和 7。

此外,数组 {2, 1, 1, 3, 2, 1, 1, 3} 的另一个示例,算法应返回 3,因为我们正在寻找的子数组是 {1, 3, 2}(原始数组的索引 2-4)。

我在这里发现了一些类似的问题:找到包含列表所有元素的子列表的最小长度,但似乎没有答案。

函数签名应该是:<code>int算法(std::vector

共有1个答案

仉洲
2023-03-14

在O(n)中查找最后一个子数组:

例如,对于数组< code>[1,2,3,2,2,1,1],获取哈希表/映射(或小范围数组)中项的计数:< code>{ 1: 3,2: 3,3: 1 }

要查找子数组的起始索引,请从数组中的第一个值开始,并检查其计数是否大于 1。如果它的计数大于 1,则将其计数减少 1,然后继续下一个值,直到计数的值为 1。向后重复相同的操作以找到子数组的最后一个索引:

1, 2, 3, 2, 2, 1, 1
      ^        ^

在O(n)中找到其余的子数组:

现在要检查这是否是最小的子阵列,请检查它之前的子阵列。为此,在第一个索引之前搜索位于最后一个索引的值1的最后一个。如果找到,请将第一个索引更改为它,并将最后一个索引减少一:

1, 2, 3, 2, 2, 1, 1
^           ^

现在要查找新子数组的最后一个索引,请在第一个索引和最后一个索引之间搜索位于最后一个索引处的值2并将最后一个索引更改为它:

1, 2, 3, 2, 2, 1, 1
^        ^  

重复,直到在第一个和最后一个索引之间找不到最后一个索引处的值:

1, 2, 3, 2, 2, 1, 1
^     ^  

现在检查新子数组的计数是否小于先前子数组的计数,并根据需要更新当前最小子数组的索引。

必须重复搜索其余子数组,直到在第一个索引之前找不到最后一个索引的值。

 类似资料:
  • 给定一个整数N和一个长度为N的数组,该数组由0到N-1的整数组成,可能包含也可能不包含所有整数,也可能包含重复数。查找一个从索引i到索引j的子数组(i, j),使其包含数组中的所有整数,并且具有最小长度。输出是这样一个子数组的长度 示例:A=[2,1,1,3,2,1,1,3],因此最小子数组长度=3,因为A[2]到A[4]包含所有数字 我的想法: 维护一个计数器数组和两个索引开始和结束,其中包含数

  • 我正在尝试解决这个算法问题: https://dunjudge.me/analysis/problems/469/ 为了方便起见,我总结了下面的问题陈述。 给定一个长度为 ( 多数元素定义为发生的元素 时限:1.5s 例如: 如果给定的数组是[1,2,1,2,3,2], 答案是5,因为从位置1到5 (0索引)的长度为5的子数组[2,1,2,3,2]具有出现为3的数字2 首先想到的是一个明显的强力(

  • 我有这个问题: 您将获得一个整数 A 和一个整数 k 的数组。您可以将 A 的元素递减到 k 次,目标是生成一个元素都相等的连续子数组。返回可以用这种方式生成的最长的连续子数组的长度。 例如,如果 A 是 [1,7,3,4,6,5] 并且 k 是 6,那么您可以生成 [1,7,3,4-1,6-1-1-1,5-1-1] = [1,7,3,3,3,3],因此您将返回 4。 最佳解决方案是什么?

  • 文件输入。txt由两行组成:第一行是整数N空格,然后是整数K(1 ≤ N、 K级≤ 250000). Second有N个空间除数的整数,其中每个整数都小于或等于K。保证从1到K的每个整数都在数组中。任务是找到包含所有整数的最小长度的子数组。并打印其开始和结束。请注意,索引从1开始。 示例: 我在最近的一次编程比赛中完成了这个任务。一切都结束了,我没有作弊。我已经使用python 3实现了它: 这个

  • 问题内容: 给出了长度为 n 的数组。查找子数组元素的乘积之和。 说明 数组 A* = 长度 3的 [2,3,4] 。 * 长度为 2的 子数组= [2,3],[3,4],[2,4] [2,3] 中元素的乘积= 6 [3,4] 中元素的乘积= 12 [2,4] 中元素的乘积= 8 长度 2 = 6 + 12 + 8 = 26的子数组的总和 同样,对于长度 3 ,Sum = 24 因此,乘积以模 1

  • 我有以下问题要解决: 给定一组整数,例如{1,3,2}和一个随机整数数组,例如。 找出包含集合中所有值的最短连续子数组。如果找不到子数组,则返回一个空数组。 结果: 或者 < code>[1,2,2,-5,-4,3,1,1,2,0],{1,3,2}。 结果: 我已经尝试了以下方法,我的第二个循环似乎有问题。我不确定我需要更改什么: