日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問(wèn) 生活随笔!

生活随笔

當(dāng)前位置: 首頁(yè) > 编程资源 > 编程问答 >内容正文

编程问答

(双指针、二分Binary Search) leetcode 658. Find K closest Elements

發(fā)布時(shí)間:2024/4/15 编程问答 32 豆豆
生活随笔 收集整理的這篇文章主要介紹了 (双指针、二分Binary Search) leetcode 658. Find K closest Elements 小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

題意:給定一個(gè)升序排列的數(shù)組,找到k個(gè)與x最相近的元素(即差值最小),返回的結(jié)果必須要是按升序排好的。如果有兩個(gè)數(shù)與?x的差值一樣,優(yōu)先選擇數(shù)值較小的那個(gè)數(shù)。

?

解法一:雙指針(排除法),一個(gè)一個(gè)刪,因?yàn)槭怯行驍?shù)組,且返回的是連續(xù)升序子數(shù)組,所以每一次刪除的元素一定是位于邊界;如果數(shù)組含有共 7 個(gè)元素,要保留 3 個(gè)元素,因此要?jiǎng)h除 4 個(gè)元素(arr.size()-k);因?yàn)橐獎(jiǎng)h除的元素都位于邊界,于是可以使用雙指針(左指針指向數(shù)組的第一個(gè)元素,右指針指向數(shù)組最后一個(gè)元素)對(duì)撞的方式確定保留區(qū)間。

將需要?jiǎng)h除的元素個(gè)數(shù)作為循環(huán)的條件,當(dāng)right指向的元素減去x 大于或等于 left指向的元素減去x 的距離時(shí),說(shuō)明left指向的元素更接近x,故將right-1。(因?yàn)槿绻袃蓚€(gè)數(shù)與?x的差值一樣,優(yōu)先選擇數(shù)值較小的那個(gè)數(shù))所以等于也是將right-1; 否則 left+1。

class Solution { public:vector<int> findClosestElements(vector<int>& arr, int k, int x) {int size = arr.size(), n = size-k;int left = 0, right = size-1;while(n){if(x - arr[left] <= arr[right] - x)right--;elseleft++;n--;}vector<int> a; // for(int i=left; i<=right; ++i) // a.push_back(arr[i]);a.assign(arr.begin()+left, arr.begin()+right+1);return a;} };

解法二: Binary Search

?

這道題的Binary Search 真的不好想 :( ? 下面是我整理的解題思路,參考了很多大神的思路(鏈接如下),突然發(fā)現(xiàn)二分搜索有好多變種啊,搞得我有點(diǎn)暈暈的。

?我用的兩個(gè)二分搜索模板:https://www.acwing.com/blog/content/31/

對(duì)應(yīng)的講解視頻:https://www.bilibili.com/video/av41422769

二分搜索github的總結(jié)貼:https://github.com/yuzhoujr/leetcode/issues/8

二分搜索的總結(jié)博客:http://blackblog.tech/2018/10/08/LeetCode2Divide/#more

youtube上講解這道題用二分搜索的視頻:https://www.youtube.com/watch?v=3ifFNvdfjyg

?

?

?

class Solution { public:vector<int> findClosestElements(vector<int>& arr, int k, int x) {int left = 0, right = arr.size()-k;while(left< right){int mid = left + (right-left)/2;if(x> arr[mid]){if(x-arr[mid] > arr[mid+k]-x)left = mid+1;elseright = mid;}elseright = mid;}return vector<int>(arr.begin()+left, arr.begin()+left+k);} };

?

轉(zhuǎn)載于:https://www.cnblogs.com/Bella2017/p/11223088.html

總結(jié)

以上是生活随笔為你收集整理的(双指针、二分Binary Search) leetcode 658. Find K closest Elements的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。

如果覺(jué)得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。