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

二分法我們還需要再練習練習

開發 前端
給定一個排序數組和一個目標值,在數組中找到目標值,并返回其索引。如果目標值不存在于數組中,返回它將會被按順序插入的位置。

[[429784]]

給定一個排序數組和一個目標值,在數組中找到目標值,并返回其索引。如果目標值不存在于數組中,返回它將會被按順序插入的位置。

你可以假設數組中無重復元素。

示例 1:

  • 輸入: [1,3,5,6], 5
  • 輸出: 2

示例 2:

  • 輸入: [1,3,5,6], 2
  • 輸出: 1

示例 3:

  • 輸入: [1,3,5,6], 7
  • 輸出: 4

示例 4:

  • 輸入: [1,3,5,6], 0
  • 輸出: 0

思路

這道題目不難,但是為什么通過率相對來說并不高呢,我理解是大家對邊界處理的判斷有所失誤導致的。

這道題目,要在數組中插入目標值,無非是這四種情況。

搜索插入位置3

  • 目標值在數組所有元素之前
  • 目標值等于數組中某一個元素
  • 目標值插入數組中的位置
  • 目標值在數組所有元素之后

這四種情況確認清楚了,就可以嘗試解題了。

接下來我將從暴力的解法和二分法來講解此題,也借此好好講一講二分查找法。

暴力解法

暴力解題 不一定時間消耗就非常高,關鍵看實現的方式,就像是二分查找時間消耗不一定就很低,是一樣的。

C++代碼

  1. class Solution { 
  2. public
  3.     int searchInsert(vector<int>& nums, int target) { 
  4.         for (int i = 0; i < nums.size(); i++) { 
  5.         // 分別處理如下三種情況 
  6.         // 目標值在數組所有元素之前 
  7.         // 目標值等于數組中某一個元素 
  8.         // 目標值插入數組中的位置 
  9.             if (nums[i] >= target) { // 一旦發現大于或者等于target的num[i],那么i就是我們要的結果 
  10.                 return i; 
  11.             } 
  12.         } 
  13.         // 目標值在數組所有元素之后的情況 
  14.         return nums.size(); // 如果target是最大的,或者 nums為空,則返回nums的長度 
  15.     } 
  16. }; 
  • 時間復雜度:O(n)
  • 空間復雜度:O(1)

效率如下:

搜索插入位置

二分法

既然暴力解法的時間復雜度是O(n),就要嘗試一下使用二分查找法。

搜索插入位置4

大家注意這道題目的前提是數組是有序數組,這也是使用二分查找的基礎條件。

以后大家只要看到面試題里給出的數組是有序數組,都可以想一想是否可以使用二分法。

同時題目還強調數組中無重復元素,因為一旦有重復元素,使用二分查找法返回的元素下表可能不是唯一的。

大體講解一下二分法的思路,這里來舉一個例子,例如在這個數組中,使用二分法尋找元素為5的位置,并返回其下標。

搜索插入位置5

二分查找涉及的很多的邊界條件,邏輯比較簡單,就是寫不好。

相信很多同學對二分查找法中邊界條件處理不好。

例如到底是 while(left < right) 還是 while(left <= right),到底是right = middle呢,還是要right = middle - 1呢?

這里弄不清楚主要是因為對區間的定義沒有想清楚,這就是不變量。

要在二分查找的過程中,保持不變量,這也就是循環不變量 (感興趣的同學可以查一查)。

二分法第一種寫法

以這道題目來舉例,以下的代碼中定義 target 是在一個在左閉右閉的區間里,也就是[left, right] (這個很重要)。

這就決定了這個二分法的代碼如何去寫,大家看如下代碼:

大家要仔細看注釋,思考為什么要寫while(left <= right), 為什么要寫right = middle - 1。

  1. class Solution { 
  2. public
  3.     int searchInsert(vector<int>& nums, int target) { 
  4.         int n = nums.size(); 
  5.         int left = 0; 
  6.         int right = n - 1; // 定義target在左閉右閉的區間里,[leftright
  7.         while (left <= right) { // 當left==right,區間[leftright]依然有效 
  8.             int middle = left + ((right - left) / 2);// 防止溢出 等同于(left + right)/2 
  9.             if (nums[middle] > target) { 
  10.                 right = middle - 1; // target 在左區間,所以[left, middle - 1] 
  11.             } else if (nums[middle] < target) { 
  12.                 left = middle + 1; // target 在右區間,所以[middle + 1, right
  13.             } else { // nums[middle] == target 
  14.                 return middle; 
  15.             } 
  16.         } 
  17.         // 分別處理如下四種情況 
  18.         // 目標值在數組所有元素之前  [0, -1] 
  19.         // 目標值等于數組中某一個元素  return middle; 
  20.         // 目標值插入數組中的位置 [leftright],return  right + 1 
  21.         // 目標值在數組所有元素之后的情況 [leftright], return right + 1 
  22.         return right + 1; 
  23.     } 
  24. }; 
  • 時間復雜度:O(logn)
  • 時間復雜度:O(1)

效率如下:

二分法第二種寫法

如果說定義 target 是在一個在左閉右開的區間里,也就是[left, right) 。

那么二分法的邊界處理方式則截然不同。

不變量是[left, right)的區間,如下代碼可以看出是如何在循環中堅持不變量的。

大家要仔細看注釋,思考為什么要寫while (left < right), 為什么要寫right = middle。

  1. class Solution { 
  2. public
  3.     int searchInsert(vector<int>& nums, int target) { 
  4.         int n = nums.size(); 
  5.         int left = 0; 
  6.         int right = n; // 定義target在左閉右開的區間里,[leftright)  target 
  7.         while (left < right) { // 因為left == right的時候,在[leftright)是無效的空間 
  8.             int middle = left + ((right - left) >> 1); 
  9.             if (nums[middle] > target) { 
  10.                 right = middle; // target 在左區間,在[left, middle)中 
  11.             } else if (nums[middle] < target) { 
  12.                 left = middle + 1; // target 在右區間,在 [middle+1, right)中 
  13.             } else { // nums[middle] == target 
  14.                 return middle; // 數組中找到目標值的情況,直接返回下標 
  15.             } 
  16.         } 
  17.         // 分別處理如下四種情況 
  18.         // 目標值在數組所有元素之前 [0,0) 
  19.         // 目標值等于數組中某一個元素 return middle 
  20.         // 目標值插入數組中的位置 [leftright) ,return right 即可 
  21.         // 目標值在數組所有元素之后的情況 [leftright),return right 即可 
  22.         return right
  23.     } 
  24. }; 
  • 時間復雜度:O(logn)
  • 時間復雜度:O(1)

總結

希望通過這道題目,大家會發現平時寫二分法,為什么總寫不好,就是因為對區間定義不清楚。

確定要查找的區間到底是左閉右開[left, right),還是左閉又閉[left, right],這就是不變量。

然后在二分查找的循環中,堅持循環不變量的原則,很多細節問題,自然會知道如何處理了。

本文轉載自微信公眾號「代碼隨想錄」,可以通過以下二維碼關注。轉載本文請聯系代碼隨想錄公眾號。

 

責任編輯:武曉燕 來源: 代碼隨想錄
相關推薦

2023-12-27 23:30:50

2021-12-26 00:10:39

二分法排查版本

2011-03-24 14:15:27

雙TOP二分法分頁

2018-06-15 14:26:42

2022-04-13 07:31:20

CAP定理分布式數據庫

2020-12-04 10:13:09

算法二分法效率

2017-12-19 15:54:28

工作流Git二分法

2018-09-20 22:04:01

2020-11-29 17:11:52

程序員計算機開發

2018-09-12 18:10:25

數字體驗數字性能數字體驗管理

2024-02-19 00:12:00

模型數據

2024-01-09 17:58:47

2017-08-21 08:00:59

SDK方案思考

2009-12-03 10:26:24

PHP函數strrev

2023-06-01 07:50:42

JSDocTypeScriptAPI

2022-03-09 09:34:19

智能汽車技術

2022-04-28 20:12:44

二分法搜索算法

2022-02-22 08:00:55

混合辦公網絡犯罪網絡攻擊

2019-11-28 08:52:12

5G網絡切片專網

2017-12-11 17:14:56

ERP管理數字化
點贊
收藏

51CTO技術棧公眾號

久久久久久久综合狠狠综合| 亚洲成人五区| 精品一区二区三区的国产在线播放| 日韩欧美的一区| 欧美亚洲国产免费| 国产第100页| 四虎地址8848精品| 久久精品视频一区| 午夜精品蜜臀一区二区三区免费| 欧美一级视频在线| 黄色在线小视频| 影音国产精品| 欧美一级日韩免费不卡| 日韩区国产区| 黄色av一级片| 亚洲三级精品| 五月天婷婷综合| 国产精选在线观看91| 91香蕉视频污在线观看| 台湾佬中文娱乐久久久| 99久久精品免费看国产 | 网站黄在线观看| 欧美国产91| 日韩一区二区三区高清免费看看| 亚洲一区3d动漫同人无遮挡| 波多野结衣人妻| 国内精品视频在线观看| 色综合久久天天综合网| 欧美福利精品| 免费看一级视频| 欧美精品系列| 欧美图片一区二区三区| 先锋影音亚洲资源| 亚洲影院一区二区三区| 99国内精品久久久久久久| 欧美日韩在线观看一区二区| 五月天丁香综合久久国产| 波多野结衣二区三区| 精品国产一区二区三区四区| 91久久国产最好的精华液| 乱色588欧美| 国产视频1区2区| 精品久久久中文字幕| 欧美自拍丝袜亚洲| 午夜啪啪免费视频| www视频在线| 日韩亚洲精品在线| 亚洲欧美在线一区| 少妇一级淫免费放| www久久日com| 成a人片国产精品| 欧美自拍大量在线观看| 波多野结衣a v在线| www.精品国产| 亚洲久本草在线中文字幕| 懂色一区二区三区av片| 中文字幕在线观看视频网站| 精品视频亚洲| 欧美成人精品3d动漫h| 青青青免费在线| 黄色在线网站| 国产美女主播视频一区| 欧美亚洲视频在线观看| 午夜精品久久久久99蜜桃最新版 | 偷拍日韩校园综合在线| 欧美日韩在线精品一区二区三区| 中文字幕在线观看你懂的| 欧美一区久久| 亚洲美女在线视频| 精品人妻一区二区乱码| 成人香蕉视频| 樱花影视一区二区| 日本一区二区精品视频| 国产欧美综合视频 | 久久全球大尺度高清视频| 欧美性猛交乱大交| 亚洲一二三四| 亚洲欧洲综合另类| 久久精品综合一区| 99er热精品视频| 久久狠狠一本精品综合网| 久久国产精品99国产精| 玖玖爱在线观看| 亚洲一区二区三区免费| 在线亚洲欧美专区二区| 99er在线视频| 美女羞羞视频在线观看| 97久久精品人人爽人人爽蜜臀| 国产日韩欧美日韩| 亚洲精品午夜国产va久久成人| 亚洲国产不卡| 中文字幕亚洲一区| 法国伦理少妇愉情| 国产精品白丝av嫩草影院| 欧美日韩国产电影| 日本一区二区黄色| 丰满的护士2在线观看高清| 国产精品女人毛片| 欧美午夜精品久久久久免费视 | 激情av综合网| 国产精品第10页| 天天操中文字幕| 久久久久久免费视频| 国产视频在线观看一区二区| 免费黄色在线播放| 亚洲精品一区二区在线播放∴| 色乱码一区二区三区88 | 日韩精品乱码免费| 2020欧美日韩在线视频| 久久亚洲成人av| 亚洲综合色站| 久久网福利资源网站| 毛片视频免费播放| 日韩av自拍| 中文国产成人精品| jizz日本在线播放| 日韩一区二区在线免费| 一区二区av在线| 在线国产视频一区| 国产一区日韩| 在线观看日韩av| 男人的天堂av网| 精品国产一区二区三区四区 | 91麻豆国产语对白在线观看| 中文字幕在线网站| 麻豆免费精品视频| 国产在线精品播放| 国产精品女同一区二区| 国产在线国偷精品产拍免费yy| 成人写真视频福利网| av中文字幕第一页| 国产成人精品免费在线| 超碰97在线播放| 免费观看毛片网站| 北岛玲一区二区三区四区| 国内精品视频免费| 你懂的视频在线| 欧美激情自拍偷拍| 在线免费一区| 欧美精品videosex| 精品久久久久久中文字幕| www黄色日本| 欧美大片免费高清观看| 欧美中文字幕一区二区三区| 中文字幕有码av| 视频亚洲一区二区| 日韩精品欧美激情| 蜜桃av免费在线观看| 亚洲色图二区| 性欧美视频videos6一9| 国产亚洲欧美日韩高清| 久久国产生活片100| 97神马电影| 嫩草研究院在线| 国产精品久久久久天堂| 黄色成人在线免费观看| 天堂8中文在线最新版在线| 日本精品一区二区三区高清| 手机版av在线| 久本草在线中文字幕亚洲| 一区二区三区回区在观看免费视频| 亚洲天堂网av在线| 夜夜夜久久久| 成人国产在线激情| 天堂av一区二区三区| 中文字幕欧美激情一区| 欧美在线观看视频免费| 日本久久免费| 日韩三级免费观看| 男人的天堂官网| 亚洲小说欧美另类社区| 国产精品视频内| 免费看日韩av| 国产精品对白交换视频| 北条麻妃69av| 欧美电影在线观看一区| 亚洲欧美日韩第一区| 欧美色图一区二区| 热久久国产精品| 国产一区二区在线网站| 精品51国产黑色丝袜高跟鞋| 大伊人狠狠躁夜夜躁av一区| 一级做a免费视频| 亚洲丁香日韩| 久久久久亚洲精品| 国产一级精品毛片| av不卡在线观看| 青青草综合视频| 久久91超碰青草在哪里看| 亚洲欧美精品在线| www.国产高清| 久久99久久久久| 日本一区二区三区视频免费看| 182在线播放| 日韩欧美中文字幕公布| 99鲁鲁精品一区二区三区| 日本在线播放一区二区三区| 久久99国产精品| caoprom在线| 欧美一级精品在线| 天天操天天操天天操天天操天天操| 日韩在线播放一区二区| 久久99国产精品| 欧美亚洲日本精品| 亚洲激情电影中文字幕| 国产一卡二卡在线播放| 国产成人免费xxxxxxxx| 99热都是精品| 国产亚洲久久| 久久手机免费视频| 国产免费黄色片| 中文字幕日本不卡| 91av视频免费观看| 亚洲成人一区| 91精品国产综合久久久久久丝袜| 一区二区三区视频网站| 欧美日韩电影在线播放| 潮喷失禁大喷水aⅴ无码| 蜜桃视频一区二区| 亚洲永久激情精品| 亚洲国产综合在线观看| 久久久av网站| www.久久综合| 亚洲一区二区在线免费看| 2018国产精品| 在线播放一区| 久久99精品久久久久久秒播放器| 涩涩涩视频在线观看| 国产视频欧美视频| av首页在线观看| 国产精品久久精品日日| 日本在线观看视频一区| 伊人久久大香线| 国产一区二区三区奇米久涩 | 热久久这里只有精品| 久久av少妇| 欧美日韩电影在线| 欧美极品视频在线观看| 成人动漫一区二区在线| 久久精品99国产| 日韩在线不卡| 成人激情直播| 无遮挡在线观看| 中文字幕在线观看日韩| 99国产精品欲| 亚洲第一综合色| 成人精品999| 国产资源精品在线观看| 亚洲国产精品无码av| 香蕉久久夜色精品国产更新时间| 国产精品久久久久久久久久免费 | 91av在线播放视频| 成人在线播放视频| 欧美一级久久久| 国产午夜精品久久久久| 国产精品美女一区二区三区| 成人在线观看一区二区| 久久蜜桃精品| 国产免费内射又粗又爽密桃视频 | 亚洲精品国产精品国自产| 国产精品va视频| 欧美孕妇性xx| 影音先锋在线播放| 亚洲情综合五月天| 精品久久久久成人码免费动漫| 精品久久久久久久久久ntr影视| 国产白丝一区二区三区| av一二三不卡影片| www.久久91| 亚洲欧美久久久| 91视频成人免费| 蜜桃一区二区| 国产富婆一区二区三区| 成人一区视频| 欧美在线视频播放| 日韩专区av| 色婷婷av一区二区三区久久| 日韩在线视频免费| 欧美日本乱大交xxxxx| 97免费在线观看视频| 最新成人av在线| 国产ts在线播放| 成人丝袜高跟foot| 亚洲国产午夜精品| 免费国产亚洲视频| 六月丁香婷婷在线| 在线免费高清一区二区三区| 在线国产99| 欧美日韩激情| 欧美国产综合视频| 卡通动漫国产精品| 97操在线视频| 小说区图片区亚洲| 国产精品白嫩初高中害羞小美女 | 亚洲人metart人体| 亚洲一区二区三区涩| 蜜乳av综合| 久久国产手机看片| 久久久久97| 国产精品久久久久久免费观看 | 欧美日韩午夜在线视频| www.com亚洲| 欧美性xxxxxxx| 自拍偷拍欧美亚洲| 亚洲高清在线视频| 国产一二三四在线| 亚洲最大色网站| 国产大学生自拍| 一区二区三区在线高清| 欧美老熟妇一区二区三区| 国产精品久久久久天堂| 亚洲a∨无码无在线观看| 欧美激情一区二区三区不卡 | 亚洲国产日韩在线一区模特| 青娱乐在线视频免费观看| 一区二区三区蜜桃| 国产亚洲第一页| 午夜精品一区二区三区电影天堂| 国产午夜免费视频| 亚洲图片欧美色图| 国产精品黄色网| 欧美视频中文在线看| 亚洲 欧美 中文字幕| 欧洲一区二区三区免费视频| 亚洲中文无码av在线| 欧美视频第二页| 国产精品久久久久久久久久久久久久久久久久 | 久久亚洲中文字幕无码| 国产人成精品一区二区三| 97国产在线播放| 日本视频在线一区| 婷婷激情5月天| 成人蜜臀av电影| 欧美狂猛xxxxx乱大交3| 国产精品女主播在线观看| 神马久久精品综合| 亚洲成人一区二区在线观看| 免费在线观看黄网站| 在线日韩av片| h片在线免费看| 日韩av在线免费播放| 国产精品久久久久久久龚玥菲 | 国产一区二区高清不卡| 久久99久久人婷婷精品综合| 亚洲精品乱码视频| 欧美激情亚洲| 日韩在线xxx| 国产伦精品一区二区三区视频青涩 | 国产无码精品在线播放| 色999日韩国产欧美一区二区| 一本一道精品欧美中文字幕| 日韩精品综合一本久道在线视频| 日本大片在线观看| 久久精品国产免费观看| 精精国产xxx在线视频app| 国产精品视频一区二区高潮| 天堂精品久久久久| 日本不卡在线观看| 午夜激情一区| 亚洲视频在线a| 成人午夜免费视频| 欧美成人久久久免费播放| 亚洲成a天堂v人片| 亚洲资源在线播放| 亚洲精品国产美女| 巨大荫蒂视频欧美另类大| **欧美日韩vr在线| 免费观看亚洲天堂| 日韩亚洲不卡在线| 亚洲免费观看| 免费人成视频在线播放| 欧美国产97人人爽人人喊| 国产一级特黄视频| 欧美精品丝袜久久久中文字幕| 天堂成人在线观看| 久久成人一区二区| 国产成人免费精品| 欧美福利精品| 亚洲黄色三级| 波多野结衣中文字幕在线播放| 久久精品视频在线免费观看| 日韩av综合在线| 欧美一区二区三区免费在线看| 狠狠v欧美ⅴ日韩v亚洲v大胸| 欧美激情va永久在线播放| 欧洲美女精品免费观看视频| 蜜桃狠狠色伊人亚洲综合网站| 国产精品第十页| 九九九九九九九九| 亚洲国产精品成人综合| 在线视频一区二区三区四区| 欧美va天堂va视频va在线| 香蕉视频在线免费看| 日韩av高清不卡| 偷拍视屏一区| av高清在线免费观看| 高清国产午夜精品久久久久久| 国精产品久拍自产在线网站| 日本高清不卡视频| 久久久久国产精品嫩草影院|