全球网站流量排名100,wordpress联动搜索筛选,大宗商品现货交易平台软件,深圳品牌馆设计公司658.找到K个最接近的元素 方法一#xff1a;二分查找双指针
假设数组长度为n#xff0c;数组arr已经按照升序排序#xff0c;可以将数组arr分为两部分#xff0c;前一部分所有元素[0,left]都小于x#xff0c;后一部分[right,n-1]都大于等于x#xff0c;left与right都可以…658.找到K个最接近的元素 方法一二分查找双指针
假设数组长度为n数组arr已经按照升序排序可以将数组arr分为两部分前一部分所有元素[0,left]都小于x后一部分[right,n-1]都大于等于xleft与right都可以通过二分查找获得left和right指向的元素都是各自部分最接近x的元素因此我们可以通过比较left和right指向的元素获取整体最接近x的元素如果x-arr[left]≤arr[right]-x则将left-1否则将right1相应地如果left或right已经越界那么不考虑对应部分的元素最后区间[left1,right-1]的元素就是需要获得的结果
class Solution {public ListInteger findClosestElements(int[] arr, int k, int x) {int right binarrySearch(arr,x);int left right - 1;while(k--0){if(left 0){right;}else if(right arr.length){left--;}else if(x - arr[left] arr[right] -x){left--;}else{right;}}ListInteger ans new ArrayList();for(int i left1;iright;i){ans.add(arr[i]);}return ans;}public int binarrySearch(int[] arr,int x){int low 0,high arr.length - 1;while(low high){int mid low (high - low) / 2;if(arr[mid] x){high mid;}else{low mid 1;}}return low;}
}方法二二分查找
class Solution {public ListInteger findClosestElements(int[] arr, int k, int x) {int left 0,right arr.length -1;while(right - left 1k){if(Math.abs(arr[left] - x) Math.abs(arr[right] - x)){left;}else{right--;}}ListInteger result new ArrayList();for (int i left; i right; i) {result.add(arr[i]); // 将选定范围内的元素添加到结果列表}return result;}
}