我有一个问题,试图实现一个算法使用分而治之。
给定一个未排序的数组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];
}
}
分而治之
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);
}
}
你为什么使用分而治之?
我建议你使用优先队列。你可以在谷歌上搜索更多关于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数字。任何帮助都将不胜感激。