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

算法:从多个有序列表中搜索增量整数序列

谷涵容
2023-03-14

我试图找到最有效的方法,从排序整数数组(列表)的数组(或列表)中找到整数序列。假设我有这个阵列

{
{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不会在任何其他输入数组中。

有什么有效的方法可以做到吗?除了强制数组之外,我想不出任何东西。使用任何数据结构和算法都是可以接受的。

谢谢你。

共有1个答案

陈实
2023-03-14

>

  • 从第一个数组中选取第一个值,并将其另存为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 在以下条件下,合并排序数组所需的最小操作数是多少: 拆分:可以将单个堆栈拆分为两个堆栈,方法是将堆栈的任何顶部提起并放在一边,形成一个新堆栈。 连接:两个堆栈可以通过将一个放在另一个上面来连接。仅当顶部堆叠的底板不大于底部堆叠的顶板时,才允许这样做,也就是说,必须正确订购连接的堆叠。