二分算法的介紹簡單易懂

目錄

1.概論

2.樸素的二分算法

3.求左端點的二分算法和求右端點的二分算法

4.總結


1.概論

要想了解什么是二分算法,我們就要知道什么是二分算法,二分算法是根據數組的規律,每次查找的數據原來的效率可能要O(n),而我們可以把它優化為logN,這會大大提高我們的算法效率,總的來說我們的二分算法就是通過利用數組的規律來優化效率的一種算法下面我們把二分算法進行分類:1.樸素的二分算法。2.查找左端點的二分算法。3.查找右端點的二分算法。

下面我們遵循從簡到難得規律來進行講解,幫助大家和我一起來認識二分算法。

2.樸素的二分算法

我們空說的話比較抽象,我們直接借助題目來認識二分算法。

力扣704二分查找正好合適。

看到題目,讓我們在數組中讓我們去找一個目標值,我們很容易想到遍歷數組,找到targe進行返回,但是它遍歷數組時間復雜度較高,我們發現我們沒有利用數組有序的規律,所以我們進行算法優化,我們每次求中間的值,讓它跟target進行比較,等于返回找到,小的話讓left=mid+1,大的話讓right=mid-1.我們觀察這個算法我們發現我們每次都會干掉一半的值,時間復雜度會優化到LOGN,這時候有同學就要問了:主播主播,為什么我們每次找中點呢?不能每次找三分之一點,四分之一點,五分之一點嗎?當然可以,只是經過數學大牛的計算證明,發現每次求中點的效率最高,所以我們這里只需要記住我們一般每次干掉一半即可。

下面給出我們的代碼實現:

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

3.求左端點的二分算法和求右端點的二分算法

下面我們再來一道題目,來講解我們的二分算法的進階。

這道題我們發現它讓我們求一個范圍,所以我們需要求出左右的范圍,這里我們就要進行分析了,怎么樣求呢?

經過這道題目的分析,我們也是很容易想到的暴力解法就是遍歷數組進行求解,時間復雜度同樣達到了O(n),那么我們接下來進行算法優化,抽象出來數組,主播的字比較難看,湊合著看吧。。。

我們發現我們求出最左節點我們就是要求大于等于的最左節點,注意我們只能求它們邊界的節點,這決定了我們必須得這樣劃分數組。

舉個反例:

我們這里只能求小于等于的最右點解,求不出小于等于中小框范圍的最左節點,這是我們算法導致的。硬求的話會導致效率降低,所以我們這樣劃分數組。不信我們進行求,就知道為什么不行了,

我們是這樣求的,mid>t,right=mid-1;mid<=t,left=mid;我們發現right進入小框的范圍后,變的就只有left了,我們left不斷的等于mid,會不斷向右靠,講到這里各位靚仔應該明白了吧。

所以我們進行這樣的范圍劃分是右意義的。

還有要注意的細節這里我們當left==right之后我們結束循環,因為如果有符合范圍的值,我們一般是left和right移動到同一個為止上。

第二個要注意的點就是當出現偶數的特殊情況是我們怎么解決:

我們這里對mid的處理就不同了,如果mid=left+(right-left),它是指向偶數數組中間的靠左邊,這里我們發現求最左節點靠右是正常的。但是相反當mid=left+(right-left+1)/2,mid指向right,就會出現問題,因為我們mid<target,left=mid+1;left向右靠,right=mid,right向左靠,right一直等于mid,陷入死循環,所以程序崩掉了。

我們總的來說我們根據劃分來確定mid怎么搞是>t,<=t的組合,還是>=t,<t的組合,

這樣的情況下我們就是前者的組合,

這樣的組合我們就是后者的組合

,至于求最右端點的解法,我們對求最左節點的方法反過來就可了。

下面給出本題代碼題解供大家理解:

    vector<int> searchRange(vector<int>& nums, int target) {int left=0;vector<int>num;int right=nums.size()-1;while(left<right){int mid=left+(right-left)/2;if(nums[mid]<target){left=mid+1;}else{right=mid;}}if(nums.size()!=0&&nums[left]==target){num.push_back(left);}else{num.push_back(-1);}right=nums.size()-1;while(left<right){int mid=left+(right-left+1)/2;if(nums[mid]>target){right=mid-1;}else{left=mid;}}if(nums.size()!=0&&nums[left]==target){num.push_back(left);}else{num.push_back(-1);}return num;}

4.總結

要想理解二分算法,需要自己畫圖去理解試錯,總的來說注意一下細節就可以。希望大家都可以學會這種效率算法。

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/diannao/83615.shtml
繁體地址,請注明出處:http://hk.pswp.cn/diannao/83615.shtml
英文地址,請注明出處:http://en.pswp.cn/diannao/83615.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

ROS2學習(3)------架構概述

操作系統&#xff1a;ubuntu22.04 IDE:Visual Studio Code 編程語言&#xff1a;C11 ROS版本&#xff1a;2 ROS 2&#xff08;Robot Operating System 2&#xff09;的設計旨在提供一個靈活、可擴展且高效的框架&#xff0c;用于編寫復雜的機器人軟件。它引入了發布者/訂閱者&…

墨水屏顯示模擬器程序解讀

程序如下&#xff1a;出處https://github.com/tsl0922/EPD-nRF5?tabreadme-ov-file // GUI emulator for Windows // This code is a simple Windows GUI application that emulates the display of an e-paper device. #include <windows.h> #include <stdint.h>…

【技海登峰】Kafka漫談系列(十一)SpringBoot整合Kafka之消費者Consumer

【技海登峰】Kafka漫談系列(十一)SpringBoot整合Kafka之消費者Consumer spring-kafka官方文檔: https://docs.spring.io/spring-kafka/docs/2.8.10/reference/pdf/spring-kafka-reference.pdf KafkaTemplate API: https://docs.spring.io/spring-kafka/api/org/springframe…

【言語理解】邏輯填空之邏輯對應11

front&#xff1a;詞義辨析 11.1前后解釋對應 填空的詞匯大意可能是吖要結合實際情況不要一味高估導致適得其反的結果 未雨綢繆&#xff1a;趁著天沒下雨&#xff0c;先修繕房屋門窗。比喻事先做好準備工作&#xff0c;預防意外的事發生。&#xff08;提前做好準備&#xff0c…

ubuntu上 opencv + eclipse + C++

ubuntu上 opencv eclipse C 1. 安裝eclipse 安裝eclipse不用說了&#xff0c;前置條件要安裝java 配置快捷鍵方式 2. 新建c項目 配置opencv環境 project -> properties: 配置c標準庫版本&#xff1a; 配置opencv頭文件&#xff1a; 配置opencv庫文件&#xff1a;…

動態內存管理2+柔性數組

一、動態內存經典筆試題分析 分析錯誤并改正 題目1 void GetMemory(char *p) {p (char *)malloc(100); } void Test(void) {char *str NULL;GetMemory(str);strcpy(str, "hello world");printf(str); } int main() {Test();return 0; }錯誤的原因&#xff1a; …

AI寫PPT可以用嗎?我測試了3款AI寫PPT工具,分享感受

上周五臨下班&#xff0c;領導突然讓我周末趕出一份季度營銷報告 PPT&#xff0c;還要求周一晨會展示。看著空蕩蕩的 PPT 頁面&#xff0c;我滿心都是絕望 —— 周末不僅泡湯&#xff0c;搞不好還得熬夜到凌晨。好在同部門的前輩給我推薦了幾款 AI 寫 PPT 工具&#xff0c;沒想…

PrimeVul論文解讀-如何構建高質量漏洞標簽與數據集

目錄 1. 引入2. 現有漏洞識別方案的不足2.1 數據集中label不準2.2 數據重復2.3 測評標準不夠好 3. 現有漏洞識別數據集分析3.1 關于現有數據集中label的準確率分析3.2 關于現有數據集中數據泄露&#xff08; Data Leakage&#xff09;情況分析 4. 漏洞識別測評5. PrimeVul數據集…

關于數據湖和數據倉的一些概念

一、前言 隨著各行業數字化發展的深化,數據資產和數據價值已越來越被深入企業重要發展的戰略重心,海量數據已成為多數企業生產實際面臨的重要問題,無論存儲容量還是成本,可靠性都成為考驗企業數據治理的考驗。本文來看下海量數據存儲的數據湖和數據倉,數據倉庫和數據湖,…

linux-----------------庫制作與原理(下)

1.ELF文件 要理解編譯鏈鏈接的細節&#xff0c;我們不得不了解?下ELF?件。其實有以下四種?件其實都是ELF?件&#xff1a; ? 可重定位?件&#xff08;Relocatable File &#xff09; &#xff1a;即 xxx.o ?件。包含適合于與其他?標?件鏈接來創 建可執??件或者共享…

python-爬蟲基礎

爬蟲本質&#xff1a;通過編寫程序來獲取到互聯網上的資源。 我們的程序本質上就是模擬瀏覽器 一個簡單的小爬蟲&#xff1a; 只需要三步&#xff1a; from urllib.request import urlopen #url是網址&#xff0c;request意思是請求 這里跑出來的中文是這樣的注意看&#…

單元化架構

目錄 ????????編輯 單元化 邏輯單元 單元化 多地多機房部署&#xff0c;是互聯網系統的必然發展方向&#xff0c;一個系統要走到這一步&#xff0c;也就必然要解決上面提到的問題&#xff1a;流量調配、數據拆分、延時等。業界有很多技術方案可以用來解決這些問題&…

【免殺】C2免殺技術(五)動態API

一、什么是動態API 在C2免殺領域中&#xff0c;“動態API” 主要指的是繞過靜態檢測的一種技術手段&#xff0c;其本質是運行時動態解析和調用Windows API函數&#xff0c;而不是在程序編譯階段就明確引用這些API。這種方式可以有效躲避靜態分析工具和殺軟的簽名識別。 為什么…

Python爬蟲實戰:研究JavaScript壓縮方法實現逆向解密

一、引言 在數字化信息爆炸的時代,網絡數據已成為驅動各行業發展的核心資產。Python 憑借其豐富的庫生態和簡潔的語法,成為網絡爬蟲開發的首選語言。然而,隨著互聯網安全防護機制的不斷升級,網站普遍采用 JavaScript 壓縮與混淆技術保護其核心邏輯和數據傳輸,這使得傳統爬…

HTTP 請求走私(HTTP Request Smuggling)

HTTP 請求走私&#xff08;HTTP Request Smuggling&#xff09;是一種通過利用前端代理&#xff08;如負載均衡器、CDN&#xff09;和后端服務器在 解析 HTTP 請求時存在不一致性 的漏洞&#xff0c;從而實現 注入惡意請求 的攻擊技術。 一、基本原理 HTTP 請求走私主要依賴兩…

【Google機器學習實踐指南(線性回歸篇)

&#x1f50d; Google機器學習實踐指南&#xff08;線性回歸篇&#xff09; Google機器學習實戰(3)-單變量線性回歸核心解析&#xff0c;掌握房價預測模型 一、建模流程全景圖 ▲ 四大核心步驟&#xff1a; 數據可視化→特征工程→模型訓練→預測推理 二、房價預測實戰 1. …

python打卡day16

NumPy 數組基礎 因為前天說了shap&#xff0c;這里涉及到數據形狀尺寸問題&#xff0c;所以需要在這一節說清楚&#xff0c;后續的神經網絡我們將要和他天天打交道。 知識點&#xff1a; numpy數組的創建&#xff1a;簡單創建、隨機創建、遍歷、運算numpy數組的索引&#xff1a…

ubuntu 20.04 更改國內鏡像源-阿里源 確保可用

鏡像源是跟linux版本一一對應的,查詢自己系統的版本號&#xff1a; 命令&#xff1a;lsb_release -a macw:~$ lsb_release -a No LSB modules are available. Distributor ID: Ubuntu Description: Ubuntu 20.04.6 LTS Release: 20.04 Codename: focal macw:~$…

基于OpenCV的SIFT特征和FLANN匹配器的指紋認證

文章目錄 引言一、概述二、代碼解析1. 圖像顯示函數2. 核心認證函數2.1 創建SIFT特征提取器2.2 檢測關鍵點和計算描述符&#xff08;源圖像&#xff09;2.3 檢測關鍵點和計算描述符&#xff08;模板圖像&#xff09;2.4 創建FLANN匹配器2.5 使用K近鄰匹配 3. 匹配點篩選4. 認證…

四品種交易策略

策略概述 策略思路: 交易品種:同時交易四個品種,每個品種使用總資金的10%。 合約選擇:使用連續合約(data0)發出交易信號,實際交易 主力合約(data1)和下一個主力合約(data2)。 資金管理:總資金用A_CurrentEquity表示,交易手數據此計算。 止損執行:盤中達到止損…