算法及數據結構系列 - 二分查找

系列文章目錄

算法及數據結構系列 - BFS算法


文章目錄

  • 二分查找
    • 框架思路
    • 經典題型
      • 二分查找
      • 尋找左側邊界
      • 尋找右側邊界
    • 刷題
      • 875. 愛吃香蕉的珂珂
      • 1011. 在 D 天內送達包裹的能力
      • 392. 判斷子序列

二分查找

框架思路

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

計算 mid 時需要防止溢出,代碼中 left + (right - left) / 2 就和 (left + right) / 2 的結果相同,但是有效防止了 left 和 right 太大直接相加導致溢出。

經典題型

二分查找

給定一個 n 個元素有序的(升序)整型數組 nums 和一個目標值 target ,寫一個函數搜索 nums 中的 target,如果目標值存在返回下標,否則返回 -1。

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

尋找左側邊界

注意: 當 val 不存在時,得到的索引恰好是比 val 大的最小元素索引

int left_bound(int[] nums, int target) {if (nums.length == 0) return -1;int left = 0;int right = nums.length; // 注意while (left < right) { // 注意int mid = (left + right) / 2;if (nums[mid] == target) {right = mid;} else if (nums[mid] < target) {left = mid + 1;} else if (nums[mid] > target) {right = mid; // 注意}}return left;
}

尋找右側邊界

int right_bound(int[] nums, int target) {if (nums.length == 0) return -1;int left = 0, right = nums.length;while (left < right) {int mid = (left + right) / 2;if (nums[mid] == target) {left = mid + 1; // 注意} else if (nums[mid] < target) {left = mid + 1;} else if (nums[mid] > target) {right = mid;}}return left - 1; // 注意
}

刷題

875. 愛吃香蕉的珂珂

珂珂喜歡吃香蕉。這里有 N 堆香蕉,第 i 堆中有 piles[i] 根香蕉。警衛已經離開了,將在 H 小時后回來。

珂珂可以決定她吃香蕉的速度 K (單位:根/小時)。每個小時,她將會選擇一堆香蕉,從中吃掉 K 根。如果這堆香蕉少于 K 根,她將吃掉這堆的所有香蕉,然后這一小時內不會再吃更多的香蕉。

珂珂喜歡慢慢吃,但仍然想在警衛回來前吃掉所有的香蕉。

返回她可以在 H 小時內吃掉所有香蕉的最小速度 K(K 為整數)。

提示: 吃每一堆分別要幾小時;尋找左側邊界

class Solution {public int minEatingSpeed(int[] piles, int H) {Arrays.sort(piles);int left = 1, right = piles[piles.length - 1] + 1;while(left < right){int mid = left + (right - left)/2;if(canFinish(mid, piles, H)){right = mid;}else{left = mid + 1;}}return left;}public boolean canFinish(int k, int[] piles, int H){long tmpHour = 0;for(int i = 0; i< piles.length;i++){tmpHour += (long)(piles[i] / k);if(piles[i] % k > 0){tmpHour ++;}}if(tmpHour <= H){return true;}else{return false;}}
}

1011. 在 D 天內送達包裹的能力

傳送帶上的包裹必須在 D 天內從一個港口運送到另一個港口。

傳送帶上的第 i 個包裹的重量為 weights[i]。每一天,我們都會按給出重量的順序往傳送帶上裝載包裹。我們裝載的重量不會超過船的最大運載重量。

返回能在 D 天內將傳送帶上的所有包裹送達的船的最低運載能力。

示例:

輸入:weights = [1,2,3,4,5,6,7,8,9,10], D = 5
輸出:15
解釋:
船舶最低載重 15 就能夠在 5 天內送達所有包裹,如下所示:
第 1 天:1, 2, 3, 4, 52 天:6, 73 天:84 天:95 天:10請注意,貨物必須按照給定的順序裝運,因此使用載重能力為 14 的船舶并將包裝分成 (2, 3, 4, 5), (1, 6, 7), (8), (9), (10) 是不允許的。 s
class Solution {public int shipWithinDays(int[] weights, int D) {if(weights.length == 0){return 0;}int len = weights.length;int left = weights[0], right = (weights[0] + weights[len -1]) * len / 2 + 1;while(left < right){int mid = left + (right - left)/2;if(canFinish(weights, D, mid)){right = mid;}else{left = mid + 1;}}return left;}public boolean canFinish(int[] w, int D, int cap){int i = 0;for (int day = 0; day < D; day++) {int maxCap = cap;while ((maxCap -= w[i]) >= 0) {i++;if (i == w.length)return true;}}return false;}
}

392. 判斷子序列

給定字符串 s 和 t ,判斷 s 是否為 t 的子序列。

你可以認為 s 和 t 中僅包含英文小寫字母。字符串 t 可能會很長(長度 ~= 500,000),而 s 是個短字符串(長度 <=100)。

字符串的一個子序列是原始字符串刪除一些(也可以不刪除)字符而不改變剩余字符相對位置形成的新字符串。(例如,"ace"是"abcde"的一個子序列,而"aec"不是)。

class Solution {public boolean isSubsequence(String s, String t) {int fromIndex = 0;for(int i = 0; i < s.length(); i++){char tmp = s.charAt(i);int j = fromIndex;for(; j < t.length(); j++){if(t.charAt(j) == tmp){fromIndex = j + 1;break;}}if(j == t.length()){return false;}}return true;}
}

后續挑戰 :

如果有大量輸入的 S,稱作S1, S2, … , Sk 其中 k >= 10億,你需要依次檢查它們是否為 T 的子序列。在這種情況下,你會怎樣改變代碼?

class Solution {public boolean isSubsequence(String s, String t) {int m = s.length(), n = t.length();ArrayList<Integer>[] index = new ArrayList[256];// 先記下 t 中每個字符出現的位置for (int i = 0; i < n; i++) {char c = t.charAt(i);if (index[c] == null) index[c] = new ArrayList<>();index[c].add(i);}int j = 0; // t 上的指針// 借助 index 查找 s[i]for (int i = 0; i < m; i++) {char c = s.charAt(i);// 整個 t 壓根兒沒有字符 cif (index[c] == null) return false;int pos = find(index[c], j);// 二分搜索區間中沒有找到字符 cif (pos == index[c].size()) return false;// 向前移動指針 jj = index[c].get(pos) + 1;}return true;}public int find(ArrayList<Integer> arr, int target){int left = 0, right = arr.size();while(left < right){int mid = left + (right - left)/2;if(arr.get(mid) == target){right = mid;}else if (arr.get(mid) > target){right = mid;}else {left = mid + 1;}}return left;}
}

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

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

相關文章

SpringBoot的啟動原理?

大家好&#xff0c;我是鋒哥。今天分享關于【SpringBoot的啟動原理&#xff1f;】面試題。希望對大家有幫助&#xff1b; SpringBoot的啟動原理&#xff1f; 1000道 互聯網大廠Java工程師 精選面試題-Java資源分享網 Spring Boot的啟動原理主要是通過 SpringApplication 類來…

代碼隨想錄第55期訓練營第八天|LeetCode344.反轉字符串、541.反轉字符串II、卡碼網:54.替換數字

前言 這是我參加的第二次訓練營&#xff01;&#xff01;&#xff01;爽&#xff01;這次我將更加細致的寫清每一道難題&#xff0c;不僅是提升自己&#xff0c;也希望我自己的寫的文章對讀者有一定的幫助&#xff01; 打卡代碼隨想錄算法訓練營第55期第八天&#xff08;づ&a…

Json的應用實例——cad 二次開發c#

以下是一個使用AutoCAD C#.NET API實現你需求的示例代碼&#xff0c;代碼實現了提示用戶選擇一個實體&#xff0c;將一些字符串變量及其對應的值組成JSON格式數據存儲到實體的擴展數據&#xff08;XData&#xff09;中&#xff0c;并在彈出窗口中顯示該實體的所有擴展數據信息。…

Springboot的jak安裝與配置教程

目錄 Windows系統 macOS系統 Linux系統 Windows系統 下載JDK&#xff1a; 訪問Oracle官網或其他JDK提供商網站&#xff0c;下載適合Windows系統的JDK版本。網站地址&#xff1a;Oracle 甲骨文中國 | 云應用和云平臺點擊進入下滑&#xff0c;點擊進入下載根據自己的系統選擇&…

Python與區塊鏈隱私保護技術:如何在去中心化世界中保障數據安全

Python與區塊鏈隱私保護技術:如何在去中心化世界中保障數據安全 在區塊鏈世界里,透明性和不可篡改性是兩大核心優勢,但這也帶來了一個悖論——如何在公開賬本的同時保障用戶隱私?如果你的交易記錄對所有人可見,如何防止敏感信息泄露? Python 作為區塊鏈開發中最受歡迎的…

通俗詳解redis底層數據結構哈希表之漸進式rehash

一、為什么要用漸進式rehash&#xff1f; 假設你家的舊柜子&#xff08;哈希表&#xff09;裝滿了&#xff0c;需要換個大柜子。如果一次性把所有東西倒騰到新柜子&#xff0c;你可能得停下手頭所有事&#xff0c;累得半死&#xff08;這就是傳統rehash的問題&#xff1a;卡頓…

基于 FPGA的HLS技術與應用

1、hls簡介 HLS &#xff08; high level synthesis &#xff09;即高層次綜合&#xff0c;主要是利用高級編程語言實現算法。 2、循環優化 絕大多數循環都以串行的方式執行&#xff0c;這種執行方式比較浪費時間。對于串行的循環有兩種優化方式&#xff0c;轉為 并行( Unrol…

Kafka consumer_offsets 主題深度剖析

Kafka consumer_offsets 主題深度剖析 在 Apache Kafka 的消息消費機制中&#xff0c;確保消息被可靠消費是一個核心問題。為了解決這個問題&#xff0c;Kafka 設計了一個特殊的內部主題 consumer_offsets&#xff0c;用于跟蹤和管理消費者組的消費進度。 consumer_offsets 的…

基于javaweb的SpringBoot時裝購物系統設計與實現(源碼+文檔+部署講解)

技術范圍&#xff1a;SpringBoot、Vue、SSM、HLMT、Jsp、PHP、Nodejs、Python、爬蟲、數據可視化、小程序、安卓app、大數據、物聯網、機器學習等設計與開發。 主要內容&#xff1a;免費功能設計、開題報告、任務書、中期檢查PPT、系統功能實現、代碼編寫、論文編寫和輔導、論…

B站pwn教程筆記-5

復習和回顧 首先復習一下ELF文件在內存和磁盤中的不同。內存只關注讀寫這權限&#xff0c;會合并一些代碼段。 動態鏈接庫只在內存中單獨裝在一份 因為很多軟件都要用動態鏈接庫了&#xff0c;不可能一個個單獨復制一份。但是在有的調試環境下會單獨顯示出來各一份。 ld.so是裝…

云原生網絡拓撲:服務網格的量子糾纏效應

引言&#xff1a;數據平面的蟲洞躍遷 谷歌服務網格每日處理5萬億請求&#xff0c;Istio 1.20版本時延降低至0.8ms。螞蟻集團Mesh架構節省42%CPU開銷&#xff0c;AWS App Mesh實現100ms跨區故障切換。LinkedIn Envoy配置規則達1200萬條&#xff0c;騰訊云API網關QPS突破900萬。…

爬蟲——playwright獲取亞馬遜數據

目錄 playwright簡介使用playwright初窺亞馬遜安裝playwright打開亞馬遜頁面 搞數據搜索修改bug數據獲取翻頁優化結構 簡單保存 playwright簡介 playwright是微軟新出的一個測試工具&#xff0c;與selenium類似&#xff0c;不過與selenium比起來還是有其自身的優勢的&#xff…

Matrix-Breakout-2-Morpheus靶場通關心得:技巧與經驗分享

1.安裝靶機&#xff0c;并在虛擬機打開&#xff0c;確保和kali在同一個NAT網段 2.使用kali來確定該靶機的IP nmap -O 192.168.139.1/24 3.訪問該IP192.168.139.171 4.訪問robots.txt 5.掃描目錄 gobuster dir -u http://192.168.139.171 -x php,bak,txt,html -w /usr/share/d…

機器學習掃盲系列(2)- 深入淺出“反向傳播”-1

系列文章目錄 機器學習掃盲系列&#xff08;1&#xff09;- 序 機器學習掃盲系列&#xff08;2&#xff09;- 深入淺出“反向傳播”-1 文章目錄 前言一、神經網絡的本質二、線性問題解析解的不可行性梯度下降與隨機梯度下降鏈式法則 三、非線性問題激活函數 前言 反向傳播(Ba…

(一)飛行器的姿態歐拉角, 歐拉旋轉, 完全數學推導(基于坐標基的變換矩陣).(偏航角,俯仰角,橫滾角)

(這篇寫的全是基矢變換矩陣)不是坐標變換矩陣,坐標變換矩陣的話轉置一下,之后會有推導. 是通過M轉置變換到P撇點.

C語言和C++到底有什么關系?

C 讀作“C 加加”&#xff0c;是“C Plus Plus”的簡稱。 顧名思義&#xff0c;C 就是在 C 語言的基礎上增加了新特性&#xff0c;玩出了新花樣&#xff0c;所以才說“Plus”&#xff0c;就像 Win11 和 Win10、iPhone 15 和 iPhone 15 Pro 的關系。 C 語言是 1972 年由美國貝…

PCB畫圖軟件PROTEL99SE學習-05畫出銅箔來

sch設計的是各個器件的電連接。設計的就是各種節點的網絡表關系。不管你器件怎么擺放&#xff0c;好看不好看。都不重要。最終設計電路板是把網絡表中連線的網絡節點都用銅箔實物相連&#xff0c;讓他們導電。 網表導出后我們不用去看他&#xff0c;也不用管他的格式。 我們打開…

helm部署metricbeat

背景 在Elastic Stack 7.5版本之前&#xff0c;系統默認采用內置服務進行監控數據采集&#xff08;稱為內部收集機制&#xff09;&#xff0c;這種設計存在顯著局限性&#xff1a; 當ES集群崩潰時自帶的節點監控也會隨之崩潰&#xff0c;直到集群恢復前&#xff0c;崩潰期間的…

【菜鳥飛】AI多模態:vsCode下python訪問阿里云通義文生圖API

目標 有很多多模態的AI工具&#xff0c;用的少就用在線圖形化的&#xff0c;需要批量&#xff0c;就嘗試代碼生成&#xff0c;本文嘗試代碼調用多模態AI&#xff0c;阿里通義有免費額度&#xff0c;作為練手應該挺好&#xff0c;如果以后選其他的&#xff0c;技術也是相通的。…

從零實現本地文生圖部署(Stable Diffusion)

1. 依賴安裝 文件打包下載地址&#xff08;Stable Diffusion&#xff09; # git &#xff1a; 用于下載源碼 https://git-scm.com/downloads/win # Python 作為基礎編譯環境 https://www.python.org/downloads/ # Nvidia 驅動&#xff0c;用于編譯使用GPU顯卡硬件 https://ww…