算法刷題筆記 數的范圍(C++實現)(二分法重要例題)

文章目錄

    • 題目描述
    • 題目思路
    • 題目代碼(C++)
    • 題目感想

題目描述

  • 給定一個按照升序排列的長度為n的整數數組,以及q個查詢。
  • 對于每個查詢,返回一個元素k的起始位置和終止位置(位置從0開始計數)。
  • 如果數組中不存在該元素,則返回 -1 -1

輸入格式

  • 第一行包含整數nq,表示數組長度和詢問個數。
  • 第二行包含n個整數(均在1~10000范圍內),表示完整數組。
  • 接下來q行,每行包含一個整數k,表示一個詢問元素。

輸出格式

  • q行,每行包含兩個整數,表示所求元素的起始位置和終止位置。
  • 如果數組中不存在該元素,則返回 -1 -1

題目思路

  • 本題實際上是一個整數二分問題,相當于從一個有序數組中找到兩個邊界,正好可以用二分查找方法進行解決。
  • 首先,需要找到左邊界,即指定的查詢數字在數組中的最靠前的出現位置。因此,只需要以中點為參考,判斷中點是否滿足大于等于需要查詢的數值,然后分情況設置下一個區間即可。重復這種情況,直到左右端點重合,則返回此時的點。
    • 如果中點對應的值確實大于等于需要查詢的數值,則說明需要查詢的數值在以中點為劃分的左半邊區間內(這個區間包含了上一步的中點),因此將區間的右端點修改為當前的中心點。
    • 如果中點對應的值小于需要查詢的數值,則說明需要查詢的數值在以中點為劃分的右半區間內(這個區間不包含中點,因為中點的值小于查找的值),因此將區間的左端點設置為當前中心點右邊的第一個端點即可。

為什么判定條件是大于等于而不是小于等于:如果采用小于等于,則會將原始的有序數組劃分為大于等于查詢值和小于查詢值的兩部分,此時,每一次如果中點小于等于當前查詢的值,那么左端點可能在中點的右邊(即中點實際是小于查詢值的)或中點的左邊(查詢值有多個位置,中點并非最靠左的一個),因此無法繼續二分。

為什么判定條件不使用大于或小于:以大于為例,如果采用大于,則會將原始的有序數組劃分為大于查詢值和小于等于查詢值的兩部分。此時,每一次如果中點大于當前查詢的值,一定可以判定待查詢的值一定在左半邊區間內,但是如果中點小于等于查詢值,則無法判定左邊界的位置,因為左邊界可能在中點左邊(當中點等于查詢值,且不是排在最前面的時候)或中點右邊(中點小于查詢值時)。

  • 如果此時返回的端點仍然不等于需要查找的值,說明原始數組中不存在和需要查找的值相等的元素,輸出 -1 -1;否則,繼續進行后續的步驟。
  • 后續步驟即為找出區間的右端點。與找出左端點類似,但是將條件修改為判斷中點是否滿足小于等于需要查詢的數值。當中點小于等于需要查詢的數值的時候,說明其一定在以右邊界為軸點的左邊區間中,因此將區間的左端點設置為右邊界即可;當中點大于需要查詢的數值的時候,說明其一定在以右邊界為軸點(不包括右邊界)的右邊區間中,因此將區間的右端點設置為中點向左移動一個單位后的端點即可。

題目代碼(C++)

#include <cstdio>int n,q;
const int N(1e5 + 10);
int arr[N];
int query;int main(void)
{scanf("%d %d", &n, &q);for(int i(0); i < n; ++i) scanf("%d", &arr[i]);for(int i(0); i < q; ++i) {scanf("%d", &query);int left(0), right(n - 1);while(left < right){int mid((left + right) >> 1);if(arr[mid] >= query) right = mid;else left = mid + 1;}if(arr[left] != query) printf("-1 -1\n");else{printf("%d ",left);left = 0, right = n - 1;while(left < right){int mid((left + right + 1) >> 1);if(arr[mid] <= query) left = mid;else right = mid - 1;}printf("%d\n", right);}}return 0;
}

題目感想

  • 整數二分算法的模板中,需要注意如果是滿足條件需要將左邊界修改為區間中點(即left = mid),則進行中點位置計算時需要額外加1,否則會出現死循環。
  • 二分的最大難點在于判斷使用什么中點判定條件,如上代碼所示。
  • 嘗試將代碼中的所有scanf函數修改為C++中的cin輸入方式,發現運行時間天差地別,如下圖所示。圖中所有兩位數的運行時間都是使用scanf得到的結果,三位數的運行時間都是cin得到的結果。
    在這里插入圖片描述

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

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

相關文章

Docker【2】iptables 錯誤解決

iptables 錯誤解決 問題說明問題分析解決步驟1. 確保 iptables 模塊已加載2. 檢查和重啟 docker 服務3. 檢查 firewalld 狀態4. 重置 iptables 規則5. 查看和更新 Docker 配置 總結 問題說明 執行的 docker 命令如下&#xff0c;啟動 nginx 并設置宿主機端口 (8080) 與容器端口…

學習Uni-app開發小程序Day25

這一章學習了觸底加載更多阻止無效的網絡請求、分類列表存入Storage在預覽頁面讀取緩存展示、通過swiper的事件實現真正的壁紙預覽及切換 觸底加載更多阻止無效的網絡請求、load-more樣式的展現 前面已經學習了當列表觸底后&#xff0c;會繼續加載&#xff0c;當到最后一層后…

自動化測試--利用pytest實現整條業務鏈路測試

? 概述 前面一章講解了單個接口的測試&#xff0c;但是實際項目中&#xff0c;因為權限和登錄狀態的限制&#xff0c;大部分接口沒辦法直接訪問到&#xff0c;這時候我們想訪問到一個系統的接口&#xff0c;就需要模擬用戶登錄拿到用戶的token和所擁有的權限之后再將這些信息…

vivado2020.2創建hls仿真工程實現led閃爍

下載vivado2020.2后會有這個出現在桌面 點擊進入創建工程&#xff0c;這里注意不要有前面的\我再復制的時候復制錯了導致創建失敗 按f光標就會跳轉到下一個f開頭的函數處&#xff0c;要查找其他函數也同理 生成了一個synthesis summary文件 找到目錄下生成的.v文件 an 點…

Pod進階——資源限制以及探針檢查

目錄 一、資源限制 1、資源限制定義&#xff1a; 2、資源限制request和limit資源約束 3、Pod和容器的資源請求和限制 4、官方文檔示例 5、CPU資源單位 6、內存資源單位 7、資源限制實例 ①編寫yaml資源配置清單 ②釋放內存&#xff08;node節點&#xff0c;以node01為…

【知識蒸餾】多任務模型 logit-based 知識蒸餾實戰

一、什么是邏輯&#xff08;logit&#xff09;知識蒸餾 Feature-based蒸餾原理是知識蒸餾中的一種重要方法&#xff0c;其關鍵在于利用教師模型的隱藏層特征來指導學生模型的學習過程。這種蒸餾方式旨在使學生模型能夠學習到教師模型在特征提取和表示方面的能力&#xff0c;從…

有些錯誤,常犯常新、常新常犯:記錄一個使用element-plus的tooltip組件的錯誤

使用element-plus的tooltip組件&#xff0c;最開始的寫法是這樣的&#xff1a; <el-tooltipclass"box-item"effect"dark"content"tooltip content" ><el-button v-if"isDisabled" :underline"false" type"pr…

持續總結中!2024年面試必問 20 道 Redis面試題(五)

上一篇地址&#xff1a;持續總結中&#xff01;2024年面試必問 20 道 Redis面試題&#xff08;四&#xff09;-CSDN博客 九、Redis的同步機制了解么&#xff1f; Redis 的同步機制是其復制策略的核心部分&#xff0c;確保數據在主節點&#xff08;master&#xff09;和從節點…

【C語言】程序員自我修養之文件操作

【C語言】程序員自我修養之文件操作 &#x1f525;個人主頁&#xff1a;大白的編程日記 &#x1f525;專欄&#xff1a;C語言學習之路 文章目錄 【C語言】程序員自我修養之文件操作前言一.文件介紹1.1為什么使用文件1.2文件分類1.3二進制文件和文本文件 二.文件的打開和關閉2.…

桌面藏線大法

1有線改無線&#xff1a; 藍牙鼠標 藍牙鍵盤 藍牙耳機 2將排插貼到桌子底下 購物軟件上搜 3斷舍離 不要的電子產品統統扔掉 4 洞洞板和掛鉤 這個不用介紹了

爬蟲基本原理及requests庫用法

文章目錄 一、爬蟲基本原理1、什么是爬蟲2、爬蟲的分類3、網址的構成4、爬蟲的基本步驟5、動態【異步】頁面和靜態【同步】頁面6、請求頭 二、requests基本原理及使用1、chrome 抓包按鈕詳解1.1 Elements1.2 元素定位器1.3 Network1.4 All1.5 XHR1.6 Preserve log1.7 手機模式1…

暴雨信息液冷計算解決方案亮相CCIG 2024

5月24日&#xff0c;2024中國圖象圖形大會&#xff08;CCIG&#xff09;在陜西西安正式開幕。作為涵蓋圖像圖形各專業領域的綜合性的全國性學術會議&#xff0c;CCIG面向開放創新、交叉融合的發展趨勢&#xff0c;為圖像圖形相關領域的專家學者和產業界的同仁&#xff0c;搭建了…

Java+Spring+ MySQL + MyCat云HIS有哪些優勢?智慧醫療云(HIS)低成本與安全保障的完美結合

JavaSpring MySQL MyCat云HIS有哪些優勢&#xff1f;智慧醫療云(HIS)低成本與安全保障的完美結合 云HIS的優點包括節省成本、便捷高效、穩妥安全等。通過云HIS&#xff0c;醫療機構無需在本地建立機房、購買服務器和應用軟件&#xff0c;降低了硬件和人力成本。同時&#xff0…

虛擬化介紹

虛擬化介紹 概述概念特點優勢實現手段 虛擬化架構概述寄居虛擬化架構裸金屬虛擬化架構操作系統虛擬化架構混合虛擬化架構幾種虛擬化架構的比較虛擬化架構與虛擬化技術的關系 虛擬化技術分類服務器虛擬化技術分類 存儲虛擬化技術分類網絡虛擬化技術分類 服務器虛擬化技術處理器虛…

開源軟件 | 一文徹底搞懂許可證的定義、起源、分類及八大主流許可證,讓你選型不再頭疼

為什么開源軟件會存在許可證&#xff0c;許可證的起源與產生目的是為了解決什么問題&#xff1f;許可證的定義又是怎樣的&#xff1f;什么是Copyleft&#xff0c;與Copyright有何區別&#xff1f;開源軟件常見的許可證有哪些&#xff1f;這些許可證都有什么特點&#xff1f;接下…

[c++] 小游戲 能量1.0.1 版本 zty出品

大家好 緊急修改&#xff0c;發現判斷游戲是否結束部分有問題&#xff0c;緊急修改bug&#xff0c;對大家造成的不便我深感歉意&#xff0c;對不起 先贊后看 養成習慣 code&#xff1a; #include<bits/stdc.h> #include<windows.h> using namespace std; int rg…

Zabbix實現7x24小時架構監控

上篇&#xff1a;https://blog.csdn.net/Lzcsfg/article/details/138774511 文章目錄 Zabbix功能介紹Zabbix平臺選擇安裝Zabbix監控端部署MySQL數據庫Zabbix參數介紹登錄Zabbix WEBWEB界面概覽修改WEB界面語言添加被控主機導入監控模板主機綁定模板查看主機狀態查看監控數據解…

6.封裝讀寫游戲數據的功能

前置知識&#xff1a;5.模仿CheatEngine實現鎖血無敵功能&#xff08;封裝它的代碼&#xff09; 封裝功能.cpp文件 #include "封裝功能.h"GAMECheat::GAMECheat(unsigned pid, unsigned _baseAdr, unsigned _readTime) {readTime _readTime;baseAdr _baseAdr;hPr…

代碼隨想錄算法訓練營第三十四天 | 理論基礎、455.分發餅干、376、擺動序列、53.最大子序和

目錄 理論基礎 455.分發餅干 思路 代碼 376.擺動序列 思路 代碼 53.最大子序和 思路 代碼 理論基礎 代碼隨想錄 455.分發餅干 代碼隨想錄 思路 可以是大餅干優先滿足大胃口&#xff0c;也可以是小餅干優先滿足小胃口。 代碼 class Solution:def findContentChildre…

ArkUI-X開發指南:【SDK配置和構建說明】

ArkUI-X SDK配置和構建說明 ArkUI-X SDK是ArkUI-X開源項目的編譯產物&#xff0c;可將ArkUI-X SDK集成到現有Android和iOS應用工程中&#xff0c;使開發者基于一套ArkTS主代碼&#xff0c;就可以構建支持多平臺的精美、高性能應用。SDK內容包含ArkUI跨平臺運行時&#xff0c;組…