我试图找到最有效的方法,从排序整数数组(列表)的数组(或列表)中找到整数序列。假设我有这个阵列
{
{1, 3, 4, 9, 15},
{5, 10, 13},
{2, 6, 11, 17},
{7, 8, 12}
}
然后解应该返回连续递增数的数组数组
{ {4, 5, 6, 7}, {9, 10, 11, 12} }
在结果中,4和9来自第一个子数组,5和10来自第二个子数组,依此类推。约束条件是,最终输出中的所有数组必须具有与输入中的数组数相同的固定长度,即,输入中的所有数组必须在结果中的每个数组中提供1个元素。
我们可以假设输入数组已排序,并且输入数组中没有重复项,例如,在示例中,如果9在数组1中,我可以假设9不会在任何其他输入数组中。
有什么有效的方法可以做到吗?除了强制数组之外,我想不出任何东西。使用任何数据结构和算法都是可以接受的。
谢谢你。
>
从第一个数组中选取第一个值,并将其另存为prevValue
。
在每个输入数组中构建一个位置(索引)数组,并将其初始化为0。
迭代输入数组:
>
将prevValue
更新为找到的值。
现在,位置数组存储下一个递增值序列的位置。将值保存到结果。
重复步骤3和4,直到完成。
作为代码,应该是这样的:
private static int[][] findIncrementalSequences(int[][] input) {
int[] pos = new int[input.length];
int prevValue = Integer.MIN_VALUE;
List<int[]> results = new ArrayList<>();
for (;;) {
int[] result = new int[pos.length];
for (int i = 0; i < pos.length; i++) {
while (pos[i] < input[i].length && input[i][pos[i]] <= prevValue)
pos[i]++;
if (pos[i] == input[i].length)
return results.toArray(new int[results.size()][]);
prevValue = result[i] = input[i][pos[i]];
}
results.add(result);
}
}
测试
int[][] input = { {1, 3, 4, 9, 15},
{5, 10, 13},
{2, 6, 11, 17},
{7, 8, 12} };
System.out.println(Arrays.deepToString(findIncrementalSequences(input)));
输出
[[1, 5, 6, 7], [9, 10, 11, 12]]
使现代化
如果每个子结果必须是连续递增值,则可以修改代码以在输入[0]处重新启动,如果下一个数字不完全比前一个值高1。
下面的代码也略有更改,以删除重复的数组查找。
private static int[][] findConsecutiveSequences(int[][] input) {
int[] pos = new int[input.length];
int nextValue = Integer.MIN_VALUE, value;
List<int[]> results = new ArrayList<>();
for (;;) {
int[] result = new int[pos.length];
for (int i = 0; i < pos.length; i++) {
for (;;) {
if (pos[i] == input[i].length)
return results.toArray(new int[results.size()][]);
if ((value = input[i][pos[i]]) >= nextValue)
break;
pos[i]++;
}
if (i == 0 || value == nextValue) {
result[i] = value;
nextValue = value + 1;
} else {
i = -1; // Restart with input[0]
}
}
results.add(result);
}
}
输出
[[4, 5, 6, 7], [9, 10, 11, 12]]
问题内容: 用Python的方式搜索或操作排序序列是什么? 问题答案: 是标准库的一部分-您正在寻找这种东西吗?
问题内容: 假设列表中没有连续的整数。 我已经尝试过使用NumPy()来解决每个元素之间的差异,但是还无法使用它来获得答案。下面是输入(第一行)和预期输出(第二行)的两个示例。 问题答案: 您可以用来对列表中的顺序元素对启用迭代,并跟踪序列未增加的索引值,以便将相应的切片附加到输出列表中。
问题内容: 假设我有以下数组: 我怎么在那里我有值序列发生指数:?因此,在这种情况下的预期输出为:。 编辑: 1)请注意,这只是一个序列。可能是或或,仅此而已。 2)如果将我的数组修改为:,则具有相同序列的预期结果将是。 我正在寻找一些NumPy快捷方式。 问题答案: 嗯,这基本上是图像处理中经常出现的问题。这篇文章中列出了两种方法:基于纯NumPy和基于OpenCV(cv2)。 方法1: 使用N
问题内容: 我不知道是否为此问题选择了合适的标题(如果没有,请相应地更改它),但是请考虑以下我正在使用的简化表结构: ,,,,,都是不相关的整数/浮筒,它们都代表不同的因素,并可以具有数量级的非常不同的顺序( 范围可从1 - 10,而的范围可以从100 - 1000 )。 我正在尝试选择条件相似的日期。给定一组,,,,,值我需要 返回由下令所有结果 接近 所有值作为一个整体 ,例如,如果,,,,和
有一个unique的数组列表,我需要将它们在z大小的数组列表之间随机分布。请记住: 是可变值 一个示例是,当您有一个由8个元素组成的数组的原点,并且希望输出3个大小为6的数组时: 原始数组列表:[1, 2, 3, 4, 5, 6, 7, 8] 结果输出:[7,5,3,6,4,8],[7,5,1,8,2,3],[8,1,2,3,4,6] 我开发了一个算法,并在注释中进行了解释。首先,我创建了一个包含
注意:我不想使用任何库。试图解决https://icpc.kattis.com/problems/stacking 在以下条件下,合并排序数组所需的最小操作数是多少: 拆分:可以将单个堆栈拆分为两个堆栈,方法是将堆栈的任何顶部提起并放在一边,形成一个新堆栈。 连接:两个堆栈可以通过将一个放在另一个上面来连接。仅当顶部堆叠的底板不大于底部堆叠的顶板时,才允许这样做,也就是说,必须正确订购连接的堆叠。