Arrays 求包含数组/向量所有元素的最小子数组长度的算法
假设我们有一个数组{7,3,7,3,1,3,4,1}。 我需要的是一个算法(最好是一些C++代码示例),它将返回包含数组元素的最小子数组的<强>长度。p> 在本例中,它将是5:{7,3,1,3,4},这是原始数组的最短子数组,它包含数组的所有元素,即1,3,4和7 另外,数组{2,1,1,3,2,1,1,3}的另一个示例和算法应该返回3,因为我们正在寻找的子数组是{1,3,2}(原始数组的索引2-4) 我在这里发现了一些类似的问题: 但它似乎没有得到回答 函数签名应类似于:Arrays 求包含数组/向量所有元素的最小子数组长度的算法,arrays,algorithm,distinct-values,sub-array,Arrays,Algorithm,Distinct Values,Sub Array,假设我们有一个数组{7,3,7,3,1,3,4,1}。 我需要的是一个算法(最好是一些C++代码示例),它将返回包含数组元素的最小子数组的长度。p> 在本例中,它将是5:{7,3,1,3,4},这是原始数组的最短子数组,它包含数组的所有元素,即1,3,4和7 另外,数组{2,1,1,3,2,1,1,3}的另一个示例和算法应该返回3,因为我们正在寻找的子数组是{1,3,2}(原始数组的索引2-4) 我在这里发现了一些类似的问题: 但它似乎没有得到回答 函数签名应类似于: int算法(std::ve
int算法(std::vector&arr){…}
查找O(n)中的最后一个子数组:
例如,对于数组[1,2,3,2,2,1,1]
,获取哈希表/映射(或小范围数组)中项目的计数:{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
^ ^
现在检查新子阵列的计数是否小于前一个子阵列的计数,如果需要,更新当前最小子阵列的索引
必须重复搜索其余子数组,直到在第一个索引之前找不到最后一个索引的值。请查看“最长公共子序列”算法。它最初用于字符串,但也可以根据您的问题进行调整。您到底被困在哪里?你有更具体的问题吗?你在与C++进行斗争吗?您是否不确定该算法在不考虑语言的情况下如何工作?你尝试了什么?我在C++实现上很费劲。我需要C++代码,带有给定的签名,太宽了。你到底在挣扎什么?你能添加你的代码并指出你在哪里有问题吗