力扣75——二分查找

總結leetcode75中的二分查找算法題解題思路。
上一篇:力扣75——堆/優先隊列

力扣75——二分查找

  • 1 猜數字大小
  • 2 咒語和藥水的成功對數
  • 3 尋找峰值
  • 4 愛吃香蕉的珂珂
  • 1-4解題總結

1 猜數字大小

題目:

猜數字游戲的規則如下:每輪游戲,我都會從 1 到 n 隨機選擇一個數字。 請你猜選出的是哪個數字。
如果你猜錯了,我會告訴你,你猜測的數字比我選出的數字是大了還是小了。
你可以通過調用一個預先定義好的接口 int guess(int num) 來獲取猜測結果,返回值一共有 3 種可能的情況(-110):-1:我選出的數字比你猜的數字小 pick < num
1:我選出的數字比你猜的數字大 pick > num
0:我選出的數字和你猜的數字一樣。恭喜!你猜對了!pick == num
返回我選出的數字。

題解:
二分查找。用leftright分別記錄左端點和右端點。然后計算出它們的平均值mid,接著用guess(mid)判斷是大了還是小了。

class Solution {
public:int guessNumber(int n) {long int left = 1, right=n;long int mid;while(left<=right){mid = (left+right)/2;if (guess(mid)<0){right = mid-1;}else if(guess(mid)>0){left = mid +1;}else{return mid;}}return left;}
};

2 咒語和藥水的成功對數

題目:

給你兩個正整數數組 spells 和 potions ,長度分別為 n 和 m ,其中 spells[i] 表示第 i 個咒語的能量強度,potions[j] 表示第 j 瓶藥水的能量強度。同時給你一個整數 success 。一個咒語和藥水的能量強度 相乘 如果 大于等于 success ,那么它們視為一對 成功 的組合。請你返回一個長度為 n 的整數數組 pairs,其中 pairs[i] 是能跟第 i 個咒語成功組合的 藥水 數目。

題解:
快速排序,然后用upper_bound()找到第一個成功的數,這樣就可以計算出每個咒語對應的成功組合數目了。

class Solution {
public:vector<int> successfulPairs(vector<int> &spells, vector<int> &potions, long long success) {sort(potions.begin(), potions.end());for (auto &x : spells)x = potions.end() - upper_bound(potions.begin(), potions.end(), (success - 1) / x);return spells;}
};

3 尋找峰值

題目:

峰值元素是指其值嚴格大于左右相鄰值的元素。給你一個整數數組 nums,找到峰值元素并返回其索引。數組可能包含多個峰值,在這種情況下,返回 任何一個峰值
所在位置即可。你可以假設 nums[-1] = nums[n] = -∞ 。你必須實現時間復雜度為 O(log n) 的算法來解決此問題。 

題解:
二分查找。
leftright分別記錄左端點和右端點。然后計算出它們的中間值mid。接著判斷中間值,如果是峰值則return mid,如果只大于右值,則在mid的右邊進行二分查找;如果小于右值,則在mid的左邊進行二分查找。

class Solution {
public:int findPeakElement(vector<int>& nums) {int n = nums.size();// 輔助函數,輸入下標 i,返回一個二元組 (0/1, nums[i])// 方便處理 nums[-1] 以及 nums[n] 的邊界情況auto get = [&](int i) -> pair<int, int> {if (i == -1 || i == n) {return {0, 0};}return {1, nums[i]};};int left = 0, right = n - 1, ans = -1;while (left <= right) {int mid = (left + right) / 2;if (get(mid - 1) < get(mid) && get(mid) > get(mid + 1)) {ans = mid;break;}if (get(mid) < get(mid + 1)) {left = mid + 1;}else {right = mid - 1;}}return ans;}
};

4 愛吃香蕉的珂珂

題目:

珂珂喜歡吃香蕉。這里有 n 堆香蕉,第 i 堆中有 piles[i] 根香蕉。警衛已經離開了,將在 h 小時后回來。珂珂可以決定她吃香蕉的速度 k (單位:根/小時)。每個小時,她將會選擇一堆香蕉,從中吃掉 k 根。如果這堆香蕉少于 k 根,她將吃掉這堆的所有香蕉,然后這一小時內不會再吃更多的香蕉。  
珂珂喜歡慢慢吃,但仍然想在警衛回來前吃掉所有的香蕉。返回她可以在 h 小時內吃掉所有香蕉的最小速度 k(k 為整數)。

題解:

class Solution {
public:int minEatingSpeed(vector<int>& piles, int h) {int low = 1;int high = 0;for (int pile : piles) {high = max(high, pile);}int k = high;while (low < high) {int speed = (high - low) / 2 + low;long time = getTime(piles, speed);if (time <= h) {k = speed;high = speed;} else {low = speed + 1;}}return k;}long getTime(const vector<int>& piles, int speed) {long time = 0;for (int pile : piles) {int curTime = (pile + speed - 1) / speed;time += curTime;}return time;}
};

1-4解題總結

使用二分查找的場景:從一組有序特性的數據中查找某個值
有序特性:不需要嚴格有序,像題目3,因為通過判斷mid跟其左右的大小,就可以確定在其左邊或右邊一定有個峰值。

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

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

相關文章

多維時序 | MATLAB實現WOA-CNN-BiGRU-Attention多變量時間序列預測

多維時序 | MATLAB實現WOA-CNN-BiGRU-Attention多變量時間序列預測 目錄 多維時序 | MATLAB實現WOA-CNN-BiGRU-Attention多變量時間序列預測預測效果基本介紹模型描述程序設計參考資料 預測效果 基本介紹 多維時序 | MATLAB實現WOA-CNN-BiGRU-Attention多變量時間序列預測 1.程…

java 向上取整 java對小數取整

取整方法 Math.floor(double a) 向下取整 Math.ceil(double a) 向上取整 Math.round(double a) 四舍五入 0.5向下取整 Math.rint(double a) 就近取整 1.6接近2&#xff0c;所以就取2 1.4接近1&#xff0c;所以就取1 1.5跟1和2都很接近&#xff0c;這時候就取偶數 (int) 類型強轉…

MongoDB:數據庫初步應用

一.連接MongoDB 1.MongoDBCompass連接數據庫 連接路徑:mongodb://用戶名:密碼localhost:27017/ 2.創建數據庫(集合) MongoDB中數據庫被稱為集合. MongoDBCompass連接后,點擊紅色框加號創建集合,點擊藍色框加號創建文檔(數據表) 文檔中的數據結構(相當于表中的列)設計不用管…

騰訊云國際輕量應用服務器使用流程是什么呢?

騰訊云國際輕量應用服務器怎么使用呢&#xff1f;下面一起來了解一下&#xff1a; 1. 熟悉輕量應用服務器基礎知識 ①什么是輕量應用服務器 TencentCloud Lighthouse&#xff1f; ②輕量應用服務器與云服務器 CVM 的區別是什么&#xff1f; ③為什么選擇輕量應用服務器&#xf…

一個DW的計算

一個DW的計算 1- 題目: 已知一個DW1.1 要求: 從DW中取出指定的位的值1.1.1 分析1.1.2 實現1.1.3 簡化實現1.1.4 驗證 2- 題目: 已知一個DW2.1 要求: 從DW中的指定的P和S,取出指定的位的值2.1.1 分析2.1.2 實現 1- 題目: 已知一個DW 有圖中所示一行信息&#xff0c;表示一個DW(…

常見的Web安全漏洞有哪些,Web安全漏洞常用測試方法介紹

Web安全漏洞是指在Web應用程序中存在的可能被攻擊者利用的漏洞&#xff0c;正確認識和了解這些漏洞對于Web應用程序的開發和測試至關重要。 一、常見的Web安全漏洞類型&#xff1a; 1、跨站腳本攻擊(Cross-Site Scripting&#xff0c;XSS)&#xff1a;攻擊者通過向Web頁面注入…

神經網絡基礎-神經網絡補充概念-41-梯度的數值逼近

概念 梯度的數值逼近是一種用于驗證梯度計算正確性的方法&#xff0c;它通過近似計算梯度來與解析計算的梯度進行比較。雖然數值逼近在實際訓練中不常用&#xff0c;但它可以用來檢查手動或自動求導的實現是否正確。 代碼實現 import numpy as np# 定義函數 f(x) x^2 def f…

養生的年輕人,自己給自己“治病”

【潮汐商業評論/原創】 “最近嘴周總長痘&#xff0c;應該是上火了&#xff0c;我這就下單點金銀花露喝。”對于長痘這件事&#xff0c;Anna的第一反應就是“內調”。 “針對性護膚和涂藥這些方法治標不治本&#xff0c;就算用完痘痘不泛紅且癟了&#xff0c;身體里的問題沒解…

上傳文件報413Request EntityToo Large錯誤解決辦法

產生這種原因是因為服務器限制了上傳大小 1、nginx服務器的解決辦法 修改nginx.conf的值就可以解決了 將以下代碼粘貼到nginx.conf內 client_max_body_size 20M 可以選擇在http{ }中設置&#xff1a;client_max_body_size 20m; 也可以選擇在server{ }中設置&#xff1a;cli…

金蝶軟件實現Excel數據復制分錄信息粘貼到單據體分錄行中

>>>適合KIS云專業版V16.0|KIS云旗艦版V7.0|K/3 WISE 14.0等版本<<< 實現Excel數據復制分錄信息粘貼到金蝶單據體分錄中,在采購訂單|采購入庫單|銷售訂單|銷售出庫單等類型單據中,以少量的必要字段在excel表格中按模板填列好,很方便快捷地復制到金蝶單據表體…

java+springboot+mysql銀行管理系統

項目介紹&#xff1a; 使用javaspringbootmysql開發的銀行管理系統&#xff0c;系統包含超級管理員、管理員、客戶角色&#xff0c;功能如下&#xff1a; 超級管理員&#xff1a;管理員管理&#xff1b;客戶管理&#xff1b;卡號管理&#xff08;存款、取款、轉賬&#xff09…

Vue 2混入

混入&#xff08;Mixins&#xff09;是一種在Vue組件中重用代碼的方式。它允許你定義一些可復用的選項對象&#xff0c;然后將這些選項合并到不同的組件中。混入可以用于在多個組件之間共享邏輯、方法、生命周期鉤子等。 示例&#xff1a; <!DOCTYPE html> <html>…

.net core介紹

.NET Core&#xff08;現在已經重命名為.NET 5及更高版本為.NET&#xff09;是一個跨平臺的開源開發框架&#xff0c;由Microsoft開發和維護。它旨在支持構建現代、高性能、可擴展的應用程序&#xff0c;可以運行在Windows、macOS和Linux等多個操作系統上。 以下是.NET Core的…

記一次微信小游戲滲透測試

本文轉載于&#xff1a;https://www.freebuf.com/vuls/371936.html 準備工作 因為目標站點只能用微信打開&#xff0c;微信又不能調試看代碼。這里推薦可以使用pc端舊版微信3.2.1&#xff0c;具體方法放鏈接里&#xff1a; https://blog.csdn.net/qq_45863248/article/details/…

Springboot 封裝整活 Mybatis 動態查詢條件SQL自動組裝拼接

前言 ps&#xff1a;最近在參與3100保衛戰&#xff0c;戰況很激烈&#xff0c;剛剛打完仗&#xff0c;來更新一下之前寫了一半的博客。 該篇針對日常寫查詢的時候&#xff0c;那些動態條件sql 做個簡單的封裝&#xff0c;自動生成&#xff08;拋磚引玉&#xff0c;搞個小玩具&a…

chatgpt多個key循環使用解決token限速

itertools.cycle 是 Python 標準庫中的一個函數&#xff0c;它用于創建一個無限循環迭代器。它接受一個可迭代對象作為參數&#xff0c;并會不斷重復該可迭代對象的元素。 使用 itertools.cycle 可以方便地創建一個可以無限循環的迭代器。當你需要反復訪問一個可迭代對象的元素…

【Linux操作系統】深入探索Linux進程:創建、共享與管理

進程的創建是Linux系統編程中的重要概念之一。在本節中&#xff0c;我們將介紹進程的創建、獲取進程ID和父進程ID、進程共享、exec函數族、wait和waitpid等相關內容。 文章目錄 1. 進程的創建1.1 函數原型和返回值1.2 函數示例 2. 獲取進程ID和父進程ID2.1 函數原型和返回值2.…

接口測試及接口抓包常用測試工具和方法?

作為測試領域中不可或缺的一環&#xff0c;接口測試和抓包技術在軟件開發過程中扮演著至關重要的角色。不論你是新手還是有一些經驗的小伙伴&#xff0c;本篇文章都會為你詳細介紹接口測試的基本概念、常用測試工具和實際操作技巧&#xff0c;讓你輕松掌握這一技能。 接口測試…

Java數字化智慧工地管理云平臺源碼(人工智能、物聯網、大數據)

智慧工地優勢&#xff1a;"智慧工地”將施工企業現場視頻管理、建筑起重機械安全監控、現場從業人員管理、物料管理、進度管理、揚塵噪聲監測等現場設備有機、高效、科學、規范的結合起來真正實現工程項目業務流與現場各類監控源數據流的有效結合與深度配合&#xff0c;實…

在Hive/Spark上運行執行TPC-DS基準測試 (ORC和TEXT格式)

目前,在Hive/Spark上運行TPC-DS Benchmark主要是通過早期由Hortonworks維護的一個項目:hive-testbench 來完成的。本文我們以該項目為基礎介紹一下具體的操作步驟。不過,該項目僅支持生成ORC和TEXT格式的數據,如果需要Parquet格式,請參考此文《在Hive/Spark上執行TPC-DS基…