2026/4/18 11:36:05
网站建设
项目流程
做二手车的网站,做电影网站用什么软件叫什么名字,做别人一样的网站,做学历的网站题目链接#xff1a;658. 找到 K 个最接近的元素#xff08;中等#xff09; 算法原理#xff1a; 解法一#xff1a;排序 19ms击败13.08% 时间复杂度O(NlogN) 这个解法其实挺暴力的#xff0c;直接用把arr全扔链表里#xff0c;然后按照题目要求把链表排序#xff0c;…题目链接658. 找到 K 个最接近的元素中等算法原理解法一排序19ms击败13.08%时间复杂度O(NlogN)这个解法其实挺暴力的直接用把arr全扔链表里然后按照题目要求把链表排序最后取出前K个即可别忘了返回前排个序解法二双指针二分查找3ms击败100.00%时间复杂度O(NlogN)利用题目给的arr已升序排序的条件可根据x把arr分成两部分前一部分都x后一部分都≥x我们可以只用一次二分查找即可先确定right那么left就是right-1确定right用到求最左端点模型优选算法-二分18.在排序数组中查找元素的第一个和最后一个位置然后通过移动left和right确定一个[left1,right-1]区间这个区间内的元素即答案如何移动呢如果left越界left0只能right如果right越界:rightarr.length只能left--都不越界就按题意来移动如果x和left的差x和right的差就left--因为差值相同时题目规定取小的如果x和left的差x和right的差就rightJava代码class Solution { //解法一排序 public ListInteger findClosestElements(int[] arr, int k, int x) { ListInteger listnew ArrayList(); for(int a:arr) list.add(a); Collections.sort(list,new ComparatorInteger(){ Override public int compare(Integer a,Integer b){ if(Math.abs(x-a)!Math.abs(x-b)) return Math.abs(x-a)-Math.abs(x-b); else return a-b; } }); ListInteger retlist.subList(0,k); Collections.sort(ret); return ret; } }class Solution { //解法二双指针二分查找 public ListInteger findClosestElements(int[] arr, int k, int x) { int rightbinarySearch(arr,x); int leftright-1; //维护[left,right]作为结果区间 while(k--0){ if(left0) right; else if(rightarr.length) left--; else if(x-arr[left]arr[right]-x) left--; else right; } ListInteger retnew ArrayList(); for(int ileft1;iright;i) ret.add(arr[i]); return ret; } public int binarySearch(int[] arr,int x){ //最左端点模型 int left0,rightarr.length-1; while(leftright){ int midleft(right-left)/2; if(arr[mid]x) leftmid1; else rightmid; } return left; } }