leetcode 658. Find K Closest Elements | 658. 找到 K 个最接近的元素(二分查找+双指针)
生活随笔
收集整理的這篇文章主要介紹了
leetcode 658. Find K Closest Elements | 658. 找到 K 个最接近的元素(二分查找+双指针)
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
題目
https://leetcode.com/problems/find-k-closest-elements/
題解
在arr中找到第一個小于等于x的位置mid,然后再根據題意,用雙指針分別向左、向右移動。
優化點:最后只要有兩個邊界,就可以 subString 之后用來返回了,不需要每一個元素都 add 到雙端隊列中。
class Solution {public List<Integer> findClosestElements(int[] arr, int k, int x) {// 在arr中找到第一個小于等于x的位置midint l = 0;int r = arr.length - 1;int mid = l + r / 2;while (l < mid) {if (arr[mid] == x) break;else if (arr[mid] < x) l = mid;// 保左邊界else r = mid - 1;mid = (l + r) / 2;}// 從mid開始 雙指針分別左右移動l = mid;r = Math.min(mid + 1, arr.length);Deque<Integer> q = new LinkedList<>();while (q.size() < k) {if (l < 0) q.addLast(arr[r++]);else if (r > arr.length - 1) q.addFirst(arr[l--]);else {if (arr[l] == arr[r] || x - arr[l] <= arr[r] - x) q.addFirst(arr[l--]);else q.addLast(arr[r++]);}}return new ArrayList<>(q);} }總結
以上是生活随笔為你收集整理的leetcode 658. Find K Closest Elements | 658. 找到 K 个最接近的元素(二分查找+双指针)的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 灵魂拷问:用移位来代替除法运算真的效率高
- 下一篇: leetcode 287. Find t