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

分而治之——未排序数组的k元素

赵夕
2023-03-14

我有一个问题,试图实现一个算法使用分而治之。

给定一个未排序的数组tv[]查找该数组的de v[k]元素,就好像该数组已排序,但没有对数组v排序一样。

例如,如果k=3且v={2,-1,-6,7,4},则该数组的k元素为2。

因为我无法编辑传递的数组,所以我无法想出另一种方法来对数组进行排序,而不将其保存在另一个局部变量上,或者尝试像快速排序一样分割数组,并返回v的最后一个元素的位置。

如果有帮助,这是我的代码:

public static <T extends Comparable<? super T>> T kesimoRec(T v[], int izq, int der, int k) {
    if(izq < der){
    int inf = izq-1;
    T pivote = v[der];
       for(int i = izq; i < der; ++i){
           if(pivote.compareTo(v[i]) >= 0){
               ++inf;
           }
       }
       ++inf;
       if(inf > izq + k-1){
           return (kesimoRec(v, izq, inf-1, k));
       }else if( inf < izq + k-1){
           return (kesimoRec(v, inf+1, der, k-inf+izq-1));
       }else{
           return v[inf];
       }
    }else{
        return v[der];
    }
}

共有2个答案

曹浩
2023-03-14

分而治之

public static <T extends Comparable<? super T>> T kesimoRec(T v[], int izq,
            int der, int k) {
        if (izq == der) {
            return v[izq];
        }
        int pivote = partir(v, v[der], izq, der);
        if (k == pivote) {
            return v[k];
        } else if (k < pivote) {
            return kesimoRec(v, izq, pivote - 1, k);
        } else {
            return kesimoRec(v, pivote + 1, der, k);
        }
    }
聂昱
2023-03-14

你为什么使用分而治之?

我建议你使用优先队列。你可以在谷歌上搜索更多关于PriorityQueue的信息。一旦你了解了它的工作原理,你就会发现很容易想出一个解决方案。我的java代码:

public class Solution {
    public int findKthLargest(int[] nums, int k) {
        PriorityQueue<Integer> queue = new PriorityQueue<Integer>(nums.length);

        for (int num : nums) {
            queue.offer(num);
        }

        for (int i = 0; i < nums.length - k; i++) {
            queue.poll();
        }

        return queue.peek();
    }
}

嗯,对不起,我的解决方案是找到第k个最大的,但是你可以修改它来找到第k个最小的。

 类似资料:
  • 我正在使用方法5:来解决leetcode中的合并K排序问题。该算法速度非常快,大约需要100毫秒。但是,我不明白为什么方法的运行时间要慢得多(4000毫秒)。 这里是代码差异: 如果分而治之是在中运行,我可以理解分而治之为什么更快,但我想它应该仍然是线性运行的,对吗? 我还写了另一个昂贵的版本的来测试差异: 这个和的版本运行时间几乎相同。 是否存在无法处理的合并K排序列表测试用例?在《分而治之》中

  • 我和朋友在讨论是否可以在不排序数组的情况下,使用分治算法计算数组a[1…n]中出现的某个元素k的数量? 我们遇到了一个障碍,如果我们使用二进制搜索,一旦找到元素,它就会停止。有什么想法吗?

  • 我必须在C++中为函数实现分治算法,该函数返回数组中的最大值。我理解算法并已经设计了函数,但我遇到了数组索引的问题。 在伪代码中,下面是我的函数: 有没有办法找到这些导致正确行为的指数?我很感激你的帮助。

  • 在分而治之的方法中,手头的问题被分成较小的子问题,然后每个问题都独立解决。 当我们继续将子问题划分为更小的子问题时,我们最终可能会达到无法进行更多划分的阶段。 解决那些“原子”最小可能的子问题(分数)。 最后合并所有子问题的解决方案以获得原始问题的解决方案。 从广义上讲,我们可以通过三个步骤来理解divide-and-conquer方法。 Divide/Break 此步骤涉及将问题分解为更小的子问

  • 给定一个未排序的数组,我试图找到最接近数组中位数的 K 个元素。我在线性运行时间内找不到解决方案。 这里的中位数是6。 答案是2,3,4,5,6。 任何帮助或提示将不胜感激。

  • 我试图找到给定排序数组的最大K数。 ex:输入- 到目前为止,我编写的代码返回最大的K元素,但它需要返回最大的K数字。任何帮助都将不胜感激。