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

求循环数组中子序列的第k个最小数

闻人嘉木
2023-03-14

你好,我正在尝试从IEEEXtreme 2014解决这个问题:

给你N个循环排列的整数。有N种方法可以拾取长度为M(M)的连续子序列

我的方法是首先创建一个排序数组列表,将新输入插入正确的位置。我将前M个整数添加到列表中。记录第K个最小值。然后我继续删除最旧的整数并将下一个整数添加到列表中,并将新的第K个值与旧的值进行比较。这是我的排序数组列表。

class SortedArrayList extends ArrayList {  
    public void insertSorted(int value) {        
        for (int i = size()-1; i >= 0; i--){
            if( value - (Integer)get(i)>=0){            
                    add(i+1,new Integer(value));
                    return;
            }
        }
        add(0,new Integer(value));
    }
}

我认为这种蛮力方法效率不高,但还不能想出任何想法。你知道更好的解决方案吗?谢谢

共有2个答案

终子昂
2023-03-14

对于圆形阵列的问题,更优雅的解决方案是简单地使用模。因此,如果您只是在寻找模拟圆形阵列的解决方案,我建议如下:

int n = somevalue;//the startingpoint of the subsequence
int m = someothervalue;//the index in the subsequence

int absolute_index = (n + m) % N;

其中N是序列中元素的总数。

提高效率的下一步是存储第k个值的索引。这样,您只需每隔M步(最坏情况)计算一个新的K值,然后只需每隔一步将其与一个新值进行比较。但我会把这个留给你;)

谯和煦
2023-03-14

以下是一个更有效的解决方案:

>

  • 让我们摆脱循环以使事情更简单。我们可以通过将给定数组附加到它本身来做到这一点。

    我们可以假设输入中的所有数字都是唯一的。如果不是这样,我们可以使用一对(元素,位置)来代替每个元素。

    让我们对给定的数组进行排序。现在,我们将对答案使用二进制搜索(即排序的全局数组中所有子数组中第k个最小元素的位置)。

    如何检查固定候选x至少与k最小数字一样大?让我们用1标记小于或等于x的数字的所有位置,其余的用0。现在我们只需要检查是否有一个长度M的子数组至少包含k。我们可以使用滚动和在线性时间内完成。

    时间复杂度为:O(N log N)用于对输入进行排序O(N log N)用于对答案进行二进制搜索(有O(log N)检查,每个检查都是在线性时间内完成的,如4所述)。因此,总时间复杂度为O(N log N)。

    P、 我可以想到其他几个具有相同时间复杂性的解决方案,但这一个似乎是实现最简单的解决方案(它不需要任何自定义数据结构)。

  •  类似资料:
    • 子数组包含正数和负数。你必须找到一个最大和子数组,使子数组的长度大于或等于k。 下面是我用C++编写的使用Kadane算法的代码。 我的代码工作得很好,但很慢,我想不出任何方法来改进我的代码。我也读过这个问题,找到最长的子数组,它的和可以被K整除,但这不是我想要的,长度也可以大于K。

    • 这可能是微软的面试问题。 从排序的数组中找出第k个最小的元素(忽略重复项) [编辑]:数组可能包含重复项(未指定)。 想了很多次,但仍然质疑自己:还有更好的解决方案吗? 取最大堆 时间复杂度:O(NlogK) 空间复杂度:O(K) 这些元素可能是重复的。所以,通过与以前的元素进行比较来检查是否有唯一的元素 还可以使用改进版的快速排序分区算法。但它可能会导致最坏的情况,因为数组已经排序<这里出现了两

    • 题目大意: You’re given k arrays, each array has k integers. There are k^k ways to pick exactly one element in each array and calculate the sum of the integers. Your task is to find the k smallest sums amo

    • 寻找替代算法 因此,需要更有效的替代算法。提前致谢

    • 在给定的数组中,我试图找到子序列的总数,以便: 连续各学期差额不大于3 子序列的第一个元素是数组的第一个元素 子序列的最后一个元素是数组的最后一个元素 例如,在数组:中,它有5个遵循上述条件的子序列。 我正在尝试一种自下而上的方法。我尝试了以下方法,但它没有给出所有子序列和输出4,而不是5。 我该怎么做?我的直觉是,这种方法可能类似于最长的递增子序列,但不确定如何实现。

    • 本文向大家介绍C ++中最小K总和最短的子数组,包括了C ++中最小K总和最短的子数组的使用技巧和注意事项,需要的朋友参考一下 假设我们有一个数组A。我们必须找到A的最短,非空,连续子数组的长度,其总和至少为K。如果没有这样的子数组,则返回-1。 因此,如果输入类似于[5,3,-2,2,1]且k = 6,则输出将为2,如我们所见(5 + 3)> = 6 为了解决这个问题,我们将遵循以下步骤- n: