Javascript Leetcode 973使用快速选择算法的错误
我正在使用快速选择算法来解决此问题,我遇到了以下算法的Javascript Leetcode 973使用快速选择算法的错误,javascript,algorithm,Javascript,Algorithm,我正在使用快速选择算法来解决此问题,我遇到了以下算法的Max call stack extered错误,但无法找出错误所在: 我们有一张飞机上的点列表。查找距离原点(0,0)最近的K个点 (此处,平面上两点之间的距离为欧几里德距离。) 您可以按任何顺序返回答案。答案保证是唯一的(除了它的顺序) 代码: /** *@param{number[][]}点 *@param{number}K *@return{number[][]} */ var kClosest=函数(点,K){ 快速选择(点,K,
Max call stack extered
错误,但无法找出错误所在:
我们有一张飞机上的点列表。查找距离原点(0,0)最近的K个点
(此处,平面上两点之间的距离为欧几里德距离。)
您可以按任何顺序返回答案。答案保证是唯一的(除了它的顺序)
代码:
/**
*@param{number[][]}点
*@param{number}K
*@return{number[][]}
*/
var kClosest=函数(点,K){
快速选择(点,K,0,点。长度-1)
返回点。切片(0,K)
};
功能快速选择(点、K、低、高){
如果(低>=高)返回;
const partitionIndex=分区(点、低、高);
如果(分区索引===K-1)
返回;
如果(分区索引>2]
//日志('pivot:',pivot,(低+高)>>2);
while(低getDist(枢轴)){
高--;
}
如果(low)你不能对它们进行排序吗?排序不会产生最佳的解决方案。快速选择会给你O(n)
运行时间与排序O(n log n)
@guest做了什么?我的意思是,你可能对平均情况是正确的,但QuickSelect算法最糟糕的情况下的时间复杂度是O(n^2)
,它不如具有O(NlogN)
最坏情况时间复杂度的排序算法。pivot=points[(低+高)>>2]
是错误的。您需要pivot=points[(低+高)>>1]
你说得对!它解决了。@MattTimmermans我需要解决一些边缘问题,但在大多数情况下,它现在可以工作了。位移1位数就像/2,这是我的问题,而不是位移2位数。你不可以对它们进行排序吗?排序不会产生最佳解决方案。快速选择会给你O(n)
运行时vs.排序O(n log n)
@guest这样做吗?我的意思是,你可能对它的平均情况是正确的,但QuickSelect算法的最坏情况时间复杂度是O(n^2)
,这低于具有O(NlogN)
最坏情况时间复杂度的排序算法。pivot=points[(低+高)>>2]
是错误的。你想要pivot=points[(低+高)>>1]
你是对的!它修复了它。@MattTimmermans有一些边缘情况我需要修复,但大部分情况下,它现在可以工作了。位移1位就像/2,这是我的问题,而不是位移2
/**
* @param {number[][]} points
* @param {number} K
* @return {number[][]}
*/
var kClosest = function(points, K) {
quickSelect(points, K, 0, points.length - 1)
return points.slice(0, K)
};
function quickSelect(points, K, low, high) {
if (low >= high) return;
const partitionIndex = partition(points, low, high);
if (partitionIndex === K - 1)
return;
if (partitionIndex < K - 1) {
quickSelect(points, K, partitionIndex + 1, high);
} else {
quickSelect(points, K, low, partitionIndex - 1);
}
}
function partition(points, low, high) {
const pivot = points[(low+high)>>2]
//console.log('pivot:', pivot, (low+high)>>2);
while(low <= high){
while(getDist(points[low]) < getDist(pivot)){
low++;
}
while(getDist(points[high]) >getDist(pivot)){
high--;
}
if(low <= high){
swap(points, low, high);
low++;
high--;
}
}
return low;
}
function getDist(point) {
return point[0] * point[0] + point[1] * point[1];
}
function swap(arr, i, j) {
[arr[i], arr[j]] = [arr[j], arr[i]];
}