精品欧美一区二区三区在线观看 _久久久久国色av免费观看性色_国产精品久久在线观看_亚洲第一综合网站_91精品又粗又猛又爽_小泽玛利亚一区二区免费_91亚洲精品国偷拍自产在线观看 _久久精品视频在线播放_美女精品久久久_欧美日韩国产成人在线

聊聊二分查找的運用技巧

開發 前端
如果發現題目中存在單調關系,就可以嘗試使用二分查找的思路來解決,分析單調關系,寫出單調函數,搞清楚二分查找的范圍,確定查找的代碼框架,再進行邊界細化,就能夠寫出最終代碼。

前篇文章聊到了二分查找的基礎以及細節的處理問題,主要介紹了 查找和目標值相等的元素、查找第一個和目標值相等的元素、查找最后一個和目標值相等的元素 三種情況。

這些情況都適用于有序數組中查找指定元素 這個基本的場景,但實際應用中可能不會這么直接,甚至看了題目之后,都不會想到可以用二分查找算法來解決

本文就來分析下二分查找在實際中的應用,通過分析幾個應用二分查找的實例,總結下能使用二分查找算法的一些共同點,以后大家遇到相關的實際問題時,能有一個基本的分析方法,不至于一點兒頭緒也沒有

基礎的二分查

找先來回顧下基礎的二分查找的基本框架,一般實際場景都是查找和 target 相等的最左側的元素或者最右側的元素,代碼如下:

  • 查找左側邊界
int binary_search_firstequal(vector<int> &vec, int target)
{
int ilen = (int)vec.size();
if(ilen <= 0) return -1;
int left = 0;
int right = ilen - 1;
while (left <= right)
{
int mid = left + (right - left) / 2;
//找到了目標,繼續向左查找目標
if (target == vec[mid]) right = mid - 1;
else if(target < vec[mid]) right = mid -1;
else left = mid + 1;
}
if(right + 1 < ilen && vec[right + 1] == target) return right+1;
return -1;
}
  • 查找右側邊界
int binary_search_lastequal(vector<int> &vec, int target)
{
int ilen = (int)vec.size();
if(ilen <= 0) return -1;
int left = 0;
int right = ilen - 1;
while (left <= right)
{
int mid = left + (right - left) / 2;
//找到了目標,繼續向右查找目標
if (target == vec[mid]) left = mid + 1;
else if(target < vec[mid]) right = mid -1;
else left = mid + 1;
}
if(left - 1 < ilen && vec[left - 1] == target) return left - 1;
return -1;
}

二分查找問題分析

二分查找問題的關鍵是找到一個單調關系,單調遞增或者單調遞減。

我們把二分查找的代碼簡化下:

int target;             // 要查找的目標值
vector<int> vec; // 數組
int left = 0; // 數組起始索引
int right = ilen - 1; // 數組結束索引
while (left <= right) // 查找 target 位于數組中的索引
{
int mid = left + (right - left) / 2;
if (target == vec[mid]) return mid;
}

上面的二分查找的單調關系是什么呢 ?是數組的索引和索引處元素的值,索引越大,元素的值越大,用偽代碼表示形式如下:

int func(vector<int>&vec,int index)
{
return vec[index];
}
int search(vector<int>&vec,int target)
{
while (left <= right)
{
int mid = left + (right - left) / 2;
if (target == func(vec,mid))
{
....
}
else if(target > func(vec,mid))
{
...
}
else
{
...
}
}
}

上述偽代碼中,我們把單調關系用一個函數 func 來表示,傳入參數是數組以及數組索引,函數返回數組指定索引處的元素。

在二分查找的 while 循環中 target 直接和 func 函數的返回值進行比較。

聽起來有些抽象,我們直接從 leetcode 上選幾道題來分析下。

實例1: 愛吃香蕉的珂珂

從題目的描述,跟有序數組完全不搭邊,所以初看這道題,根本想不到用二分查找的方法去分析

如果看完題目,沒有任何思路的話,可以縷一縷題目涉及到的條件,看能否分析出一些有用的點

  • 題意分析
  • 珂珂要吃香蕉,面前擺了 N 堆,一堆一堆地吃
  • 珂珂 1 小時能吃 K 根,但如果一堆少于 K 根,那也得花一小時
  • 如果 1 堆大于 K 根,那么超過 K 的部分也算 1 小時
  • 問:只給 H 小時,珂珂要吃多慢(K 多小),才能充分占用這 H 小時

一般題目的問題是什么,單調關系就跟什么有關,根據題意可知:珂珂吃香蕉的速度越小,耗時越多。反之,速度越大,耗時越少,這就是題目的 單調關系

我們要找的是速度, 因為題目限制了珂珂一個小時之內只能選擇一堆香蕉吃,因此速度最大值就是這幾堆香蕉中,數量最多的那一堆, 最小速度毫無疑問是 1 了,最大速度可以通過輪詢數組獲得

int maxspeed = 1;
for(auto &elem : vec)
{
if(elem > maxspeed) maxspeed = elem;
}+

又因為珂珂一個小時之內只能選擇一堆香蕉吃,因此,每堆香蕉吃完的耗時 = 這堆香蕉的數量 / 珂珂一小時吃香蕉的數量。根據題意,這里的 / 在不能整除的時候,還需要花費 1 小時吃完剩下的,所以吃完一堆香蕉花費的時間,可以表示成

hour = piles[i] / speed;
if(0 != piles[i] % speed) hour += 1;

香蕉的堆數以及每堆的數量是確定的,要在 H 小時內吃完,時間是輸入參數,也是確定的了,現在唯一不確定的就是吃香蕉的速度,我們需要做的就是在最小速度 到 最大速度之間找出一個速度,使得剛好能在 H 小時內吃完香蕉

前面說到吃香蕉的速度和吃完香蕉需要的時間之間是單調關系,我們先把單調關系的函數定義出來

// 速度為 speed 時,吃完所有堆的食物需要多少小時
int eatingHour(vector<int>&piles,int speed)
{
if(speed <= 0) return -1;
int hour = 0;
for(auto &iter : piles)
{
hour += iter / speed;
if(0 != iter % speed) hour += 1;
}
return hour;
}

題目要求吃完香蕉的最小速度,也就是速度要足夠小,小到剛好在 H 小時內吃完所有的香蕉,所以是求速度的左側邊界

好了,分析完之后,寫出代碼:

int minEatingSpeed(vector<int> &piles, int h)
{
//1小時最多能吃多少根香蕉
int maxcount = 1;
for (auto &iter : piles)
{
if (maxcount < iter) maxcount = iter;
}
//時間的校驗
if (h < 1 || h < (int)piles.size() ) return -1;
int l_speed = 1;
int r_speed = maxcount;
while (l_speed <= r_speed)
{
int m = l_speed + (r_speed - l_speed) / 2;
// eatingHour 函數代碼見上文
int hours = eatingHour(piles, m);
if (hours == h)
{
// 求速度的左側邊界
r_speed = m - 1;
}
else if (hours < h)
{
// hours 比 h 小,表示速度過大,邊界需要往左邊移動
r_speed = m - 1;
}
else
{
// hours 比 h 大,表示速度國小,邊界需要往右邊移動
l_speed = m + 1;
}
}
return l_speed;
}

上述代碼中,我們列出了 while 循環中的 if 的所有分支,是為了幫助理解的,大家可自行進行合并。

實例2:運送包裹

題目要求 船的運載能力, 船的運載能力和運輸需要的天數成反比,運載能力越大,需要的天數越少,運載能力越小,需要的天數越多,也即存在 單調關系,下面定義出單調關系的函數。

//船的載重為 capcity 時,運載 weights 貨物需要多少天
int shipDays(const vector<int> &weights, int capacity)
{
//船載重校驗
if(capacity <= 0) return -1;
int isize = (int)weights.size();
int temp = 0;
int days = 0;
for(int i = 0; i < isize; ++i)
{
if(temp + weights[i] <= capacity)
{
temp += weights[i];
continue;
}
++days;
temp = weights[i];
}
//還有剩余的,需要額外在運送一趟
if(temp > 0) ++days;
return days;
}

題目中隱含的幾個信息:

  • 船的最小載重需要大于等于傳送帶上最重包裹的重量,因為每次至少要裝載一個包裹
  • 船的最大載重等于傳送帶上所有包裹的總重量,也即所有的包裹可以一次全部裝上船
  • 船每天只能運送一趟包裹

確定了船的運載范圍后,相當于確定了二分查找的區間,另外,題目求的是船的最小運載能力,相當于求運載能力的左側邊界。

分析到這里,就可以寫出基本的查找框架了,這里直接給出代碼了。

int shipWithinDays(vector<int> &weights, int days)
{
int isize = (int)weights.size();
if (isize <= 0) return 0;
//最小載重,需要等于貨物的最大重量
int mincapacity = 0;
//最大載重,全部貨物重量的總和
int maxcapacity = 0;
for (auto &iter : weights)
{
maxcapacity += iter;
if (iter > mincapacity)
{
mincapacity = iter;
}
}
int l = mincapacity;
int r = maxcapacity;
while (l < r)
{
int m = l + (r - l) / 2;
int d = shipDays(weights, m);
if (d == days)
{
r = m - 1;
}
else if (d < days)
{
// d 比 days 小,表示船載重太大,載重邊界需要往左移
r = m - 1;
}
else
{
// d 比 days 大,表示船載重太小,載重邊界需要往右移
l = m + 1;
}
}
return l;
}

小結總結來說,如果發現題目中存在單調關系,就可以嘗試使用二分查找的思路來解決,分析單調關系,寫出單調函數,搞清楚二分查找的范圍,確定查找的代碼框架,再進行邊界細化,就能夠寫出最終代碼。

責任編輯:武曉燕 來源: Linux開發那些事兒
相關推薦

2020-12-08 06:32:04

Kafka二分查找

2022-03-18 08:37:12

二分查找算法元素

2021-11-01 12:55:43

網絡

2022-03-28 10:03:58

二分查找算法

2023-12-22 09:37:13

二分查找數組數據庫

2022-12-05 09:42:14

C++Python算法

2022-02-15 08:25:22

hash表快排二分查找

2021-04-23 09:12:09

Java數據結構算法

2023-09-16 18:35:53

二分查找算法

2021-04-27 06:21:29

Java數據結構算法

2021-10-14 07:55:20

二分查找面試

2021-02-24 07:46:20

數據結構二叉樹

2020-12-04 10:13:09

算法二分法效率

2021-05-21 08:31:09

數據結構二叉樹

2011-07-08 14:01:26

Windows安全

2022-06-26 00:29:26

分布式系統Redis

2017-03-06 20:39:41

整潔代碼Clean Code

2023-12-27 23:30:50

2021-10-11 09:41:20

React位運算技巧前端

2021-11-10 18:52:42

SQL技巧優化
點贊
收藏

51CTO技術棧公眾號

色爱综合区网| www.av在线.com| 日韩黄色大片| 在线播放一区二区三区| 国产av熟女一区二区三区| 凸凹人妻人人澡人人添| 免费精品视频在线| 欧美激情视频在线免费观看 欧美视频免费一 | 丰满少妇xbxb毛片日本| 久久久久久久| 亚洲精品乱码久久久久久| 久久国产精品久久| 国产色片在线观看| 日韩二区三区四区| 午夜精品在线视频| 国产探花在线视频| 九九久久精品| 亚洲第一区在线观看| 美女网站色免费| 日本不卡1234视频| 一区二区三区免费观看| 亚洲人成影视在线观看| 欧洲一级在线观看| 成人av在线资源网| 亚洲www在线| 亚洲综合成人av| 亚洲免费成人| 欧美黄色片免费观看| 九九热久久免费视频| 一区二区三区视频免费观看| 精品国产伦一区二区三区免费| 簧片在线免费看| 黄色综合网址| 精品毛片三在线观看| 人妻av无码专区| 成人无遮挡免费网站视频在线观看| 国产三级精品在线| 麻豆传媒一区二区| 色屁屁草草影院ccyycom| 国产激情偷乱视频一区二区三区| 欧美一区视频在线| 国产精品999在线观看| 欧美激情视频一区二区三区在线播放| 日韩在线免费观看视频| 国产传媒在线看| 欧美限制电影| 在线视频中文亚洲| www.99热| 日本一区二区在线看| 亚洲男人天堂2019| www.中文字幕av| 最新精品国偷自产在线| 亚洲奶大毛多的老太婆| 永久免费看mv网站入口78| 欧美性生活一级片| 国产婷婷色综合av蜜臀av| 国产极品一区二区| 天美av一区二区三区久久| 亚洲精品国产品国语在线| 亚洲婷婷在线观看| 牛牛精品成人免费视频| 亚洲精品永久免费精品| 国产高潮呻吟久久| 成人免费a**址| 日韩中文字幕网| 污污的视频在线免费观看| 亚洲激情五月| 久久久欧美一区二区| 久久久久久久久久影院| 米奇777在线欧美播放| 国产精品a久久久久久| 中文字幕一区二区人妻痴汉电车| 六月丁香婷婷久久| 97人人澡人人爽| 性xxxx视频| 国产精品私人影院| 五月天激情图片| 免费成人在线电影| 精品视频在线免费观看| av电影中文字幕| 全国精品免费看| 中文字幕av一区二区| 一区二区在线观看免费视频| 亚洲区第一页| 国产欧美日韩丝袜精品一区| www.com欧美| 久久久久久久久久美女| 艳母动漫在线免费观看| 成人av影院在线观看| 91国产成人在线| 国内精品国产三级国产aⅴ久| 美国成人xxx| 色哟哟亚洲精品一区二区| 青青草偷拍视频| 久久成人免费| 91精品国产高清久久久久久91裸体| 婷婷色在线观看| 国产精品免费视频网站| 国产 日韩 欧美在线| 国产一区二区主播在线| 精品剧情在线观看| 激情无码人妻又粗又大| 日韩视频精品在线观看| 成人欧美一区二区三区黑人孕妇| 午夜视频免费看| 亚洲日本一区二区| 91看片就是不一样| 一区二区三区高清在线观看| 亚洲一区二区久久久| 久久一级黄色片| 免费高清视频精品| 久久婷婷人人澡人人喊人人爽| 久久久久久久久免费视频| 欧美性猛交xxxx偷拍洗澡| 日韩在线一区视频| 狠狠操综合网| 人人爽久久涩噜噜噜网站| 国产精品特级毛片一区二区三区| 久久久美女毛片| 欧美一级免费播放| 日韩欧美高清一区二区三区| 丝袜情趣国产精品| 国产一卡二卡三卡| 99国产精品国产精品毛片| 300部国产真实乱| 伊人久久大香伊蕉在人线观看热v 伊人久久大香线蕉综合影院首页 伊人久久大香 | 欧美连裤袜在线视频| 国精一区二区三区| 欧美一区国产二区| 国产黄色录像片| 日本亚洲天堂网| 日韩国产高清一区| 粉嫩一区二区| 亚洲毛片在线观看| 欧美特黄aaaaaa| av一区二区三区在线| 青青草国产免费| 超碰成人在线观看| 久久99精品久久久久久琪琪| 国产男男gay体育生网站| 中文字幕亚洲成人| 在线观看国产福利| 国产精品成人一区二区不卡| 国产精品视频一区国模私拍 | 久草精品视频| 亚洲91精品在线| 四季av日韩精品一区| 午夜精品爽啪视频| 国产中文字幕一区二区| 亚洲在线一区| 欧美在线视频一区二区三区| 日韩高清在线| 色偷偷av亚洲男人的天堂| 亚洲天堂网视频| 一区免费观看视频| 欧美专区第二页| 亚洲一区在线| 国产v亚洲v天堂无码| 51漫画成人app入口| 亚洲精品国产成人| 7799精品视频天天看| 国产视频视频一区| 加勒比av中文字幕| 亚洲欧美伊人| 精品久久一区二区三区蜜桃| jk漫画禁漫成人入口| 伊人成人开心激情综合网| 性高潮视频在线观看| 成人欧美一区二区三区1314| 日韩不卡的av| 国产日韩亚洲| 视频一区免费观看| 日韩欧美久久| 琪琪亚洲精品午夜在线| 亚洲搞黄视频| 精品伦理精品一区| 波多野结衣网站| 亚洲日本欧美天堂| 人妻大战黑人白浆狂泄| 麻豆91精品视频| 久久av高潮av| 免费视频一区三区| 亚洲综合日韩在线| 性国裸体高清亚洲| 日韩视频免费在线| 手机av在线免费观看| 精品视频在线免费| 国产第一页在线播放| 国产人成一区二区三区影院| 波多野结衣在线免费观看| 欧美亚洲专区| 成人一区二区av| 国产精品三级| 99在线国产| 91成人在线| 久久久久免费精品国产| 成人p站proumb入口| 欧美不卡在线视频| 中文字幕1区2区3区| 亚洲成av人片www| 美女三级黄色片| 91在线丨porny丨国产| 午夜av中文字幕| 亚洲免费网站| 日本免费a视频| 欧美wwwww| 美日韩免费视频| gogo久久日韩裸体艺术| 国产一区视频在线播放| 女人高潮被爽到呻吟在线观看| 久久久国产精品一区| 午夜视频www| 精品国产一区二区精华| 亚洲天天综合网| 色婷婷亚洲精品| 日韩三级视频在线| 一区二区三区欧美日| 亚洲不卡的av| 国产喷白浆一区二区三区| av影片在线播放| 国产在线播放一区三区四| 午夜免费一区二区| 国产偷自视频区视频一区二区| 国产精品国三级国产av| 天堂网在线观看国产精品| 午夜精品亚洲一区二区三区嫩草| 免费看久久久| 久久爱av电影| 精品中国亚洲| 国产一区二区三区奇米久涩 | 激情综合色播激情啊| 午夜激情在线观看视频| 欧美亚洲专区| 无码人妻丰满熟妇区毛片| 亚洲人体大胆视频| 无码粉嫩虎白一线天在线观看| 中文字幕一区二区三区久久网站 | 国产欧美一区二区在线播放| 亚洲精品一区二区三区中文字幕 | 午夜一区在线观看| 亚洲丁香久久久| 人妻精品一区二区三区| 欧美α欧美αv大片| 亚洲高清视频在线播放| 日韩精品一区二区三区蜜臀| www黄色网址| 精品日韩成人av| 你懂的网站在线| 亚洲精品国产免费| 久久久pmvav| 一个人看的www久久| yjizz视频网站在线播放| 在线视频中文亚洲| 黄色网在线播放| 欧美黑人狂野猛交老妇| 国产99re66在线视频| 69av视频在线播放| 美女一区网站| 国产一区二区视频在线观看| 懂色av色香蕉一区二区蜜桃| 99精品国产高清一区二区| 凹凸av导航大全精品| 精品一区二区不卡| 国产精品一区二区av交换| 亚洲午夜在线观看| 91成人观看| 日本a在线免费观看| 久久大逼视频| 伊人国产精品视频| 成人精品高清在线| 级毛片内射视频| 国产精品成人免费在线| 麻豆视频在线观看| 欧美性69xxxx肥| 在线免费观看中文字幕| 欧美一级在线免费| 国产精品国产高清国产| 最近中文字幕2019免费| 欧美人与禽猛交乱配| 欧美亚洲另类制服自拍| 九七电影院97理论片久久tvb| 99热在线国产| 精品久久综合| 日本一区午夜艳熟免费| 久久蜜桃精品| 欧美熟妇另类久久久久久多毛| 99riav一区二区三区| 日本伦理一区二区三区| 亚洲成人免费在线观看| 欧美三级网站在线观看| 日韩欧美视频在线| 国产高清在线看| 久久久女人电视剧免费播放下载| 欧美性片在线观看| 国产精品区一区| 三上亚洲一区二区| 欧美老熟妇喷水| 国产一区二区在线看| 伊人网在线视频观看| 亚洲午夜私人影院| 亚洲天堂手机版| 亚洲性av网站| brazzers在线观看| 91热精品视频| 成人羞羞视频在线看网址| 高清欧美精品xxxxx| 国产在线精品视频| 无码少妇一区二区| 天天影视涩香欲综合网| 国产成人久久精品77777综合 | 久久99精品久久久久久青青日本| 久久精品一区二区不卡| www.玖玖玖| 成人午夜在线视频| 天堂网avav| 欧美日本乱大交xxxxx| 青春有你2免费观看完整版在线播放高清 | 亚洲最大福利视频网站| 欧美自拍偷拍| 国内外成人免费激情视频| 国产91丝袜在线18| 欧美第一页在线观看| 欧美日韩一区在线观看| 国产在线黄色| 日本精品一区二区三区在线| 欧美激情99| 国产精品专区在线| 国产aⅴ精品一区二区三区色成熟| 久久久久久久麻豆| 欧美亚洲一区二区在线观看| 美国一级片在线免费观看视频| 91精品国产777在线观看| 91综合久久爱com| 久久久久久久9| 成人一级视频在线观看| 久久精品一区二区三| 日韩欧美在线一区二区三区| 黄色网页在线观看| 91精品视频专区| 亚洲国产一区二区三区在线播放| 香蕉视频xxxx| 亚洲永久精品国产| 超碰免费在线97| 欧美精品久久一区二区| 91精品久久久久久综合五月天| 狠狠噜天天噜日日噜| 国产精品一区二区免费不卡| 欧美成人一二三区| 日韩欧美在线不卡| 日韩三级电影视频| 国产精选在线观看91| 亚洲高清毛片| 播金莲一级淫片aaaaaaa| 欧美性猛交xxxx| 成人综合影院| 成人国产精品一区二区| 888久久久| 亚洲图片欧美另类| 激情av一区二区| 黄色影院在线播放| 国产美女91呻吟求| 国产精品久久久久久影院8一贰佰| 亚洲国产日韩在线一区| 亚洲一区二三区| 午夜视频福利在线观看| 国产精品都在这里| 亚洲精品99| 这里只有精品在线观看视频| 欧美视频一二三| 91caoporm在线视频| 91成人伦理在线电影| 亚洲精品美女91| 国产精品成人在线视频| 日韩一区二区三区四区| 麻豆视频在线观看免费网站黄| 日本一区不卡| 国产精品乡下勾搭老头1| 91香蕉在线视频| 丝袜情趣国产精品| 999久久久精品一区二区| 农村妇女精品一二区| 亚洲素人一区二区| 亚洲三区在线播放| 91美女福利视频高清| 国产午夜精品一区二区三区欧美 | 色婷婷精品久久二区二区密| 日本乱人伦aⅴ精品| 成人午夜在线影视| 欧美一区二区三区四区五区六区| 黄页视频在线91| 国产精品男女视频| 久久精品国产久精国产一老狼| 日韩在线观看中文字幕| 成人精品视频一区二区| 一区二区三区**美女毛片| 欧美视频综合| 成人国产一区二区| 美女一区二区久久| www.国产色| 欧美夫妻性视频|