数组中的第K个最大元素尝试快排
来源:3-5 三路快排partition思路的应用 Sort Color
慕粉3884565
2021-08-01
/** * 给定整数数组 nums 和整数 k,请返回数组中第 k 个最大的元素。 * 请注意,你需要找的是数组排序后的第 k 个最大的元素,而不是第 k 个不同的元素。 * @param {number[]} nums * @param {number} k * @return {number} */ var findKthLargest = function(nums, k) { if(k>nums.length){ return -1; } if(nums.length<2){ return 1; } let middle = partition(nums,0,nums.length-1); let last = nums.length-k; let list =[]; if(last>middle){ let sliceArray = nums.slice(middle) list = sort(sliceArray,0,sliceArray.length-1); return list[list.length-k]; }else if(last<middle){ let sliceArray = nums.slice(0,middle) list = sort(sliceArray,0,sliceArray.length-1); let surplusR = nums.length-middle; k = k-surplusR; return list[list.length-k]; }else{ return nums[middle]; } return -1; }; function partition(arr, left, right) { let index =left; let middle = arr[right]; for(let i=left;i<arr.length;i++){ if(arr[i]<middle){ [arr[i],arr[index]] = [arr[index], arr[i]]; index++; } } [arr[index],arr[right]] = [arr[right],arr[index]]; return index; } function sort(arr, left, right) { if(left>right){ return; } let middle = partition(arr,left,right); sort(arr, left, middle-1); sort(arr, middle+1,right); return arr; } let arr= [3,2,3,1,2,4,5,5,6]; findKthLargest(arr, 4,);
哎结果呢,花时间比较长
老师就是根据现在学的单纯通过数组排序是不是只能到这个成都
写回答
1回答
-
类似 js 这类语言的问题在于,解释器的执行对算法的影响是巨大的,同时解释器底层对标准库的优化,使得调用标准库远远快于自己写底层逻辑。所以一个理论上更优的算法,在这类脚本语言上,很有可能表现结果更差。
你试一下,我估计你排一下序,直接取第k 大元素,比这样写快多了。
所以,对于计算机专业的学生,我向来不建议使用脚本语言学习算法。包括 python。当然,学习算法逻辑没有问题,但是使用脚本语言测试算法性能,会产生很多类似这样的问题。不是说 C++ 或者 Java 没有这类问题,但比脚本语言好很多;
继续加油!:)
032021-08-02
相似问题