力扣hot100_二分查找

二分查找

hot100_34.在排序數組中查找元素的第一個和最后一個位置

給你一個按照非遞減順序排列的整數數組 nums,和一個目標值 target。請你找出給定目標值在數組中的開始位置和結束位置。

如果數組中不存在目標值 target,返回 [-1, -1]

你必須設計并實現時間復雜度為 O(log n) 的算法解決此問題。

示例 1:

輸入:nums = [5,7,7,8,8,10], target = 8
輸出:[3,4]

示例 2:

輸入:nums = [5,7,7,8,8,10], target = 6
輸出:[-1,-1]

示例 3:

輸入:nums = [], target = 0
輸出:[-1,-1]
#include<iostream>
#include<vector>
using namespace std;class Solution {
public:int search(vector<int>& nums, float target){int l = 0, r = nums.size()-1;while(l <= r){int m = (r + l)/2;if(nums[m] > target)	r = m - 1;else	l = m + 1;}return l;}vector<int> searchRange(vector<int>& nums, int target) {int left = search(nums, float(target - 0.5));int right = search(nums, float(target + 0.5)) - 1;
//		cout << left << " " <<right << endl;if(left <= right)	return {left, right};else return {-1, -1};		}
};int main(){vector<int> nums = {5,6,6,8,8,9};int target  = 7;Solution A;vector<int> ans = A.searchRange(nums, target);cout << ans[0] << " " << ans[1] << endl;return 0;
}

hot100_33.搜索旋轉排序數組

整數數組 nums 按升序排列,數組中的值 互不相同

在傳遞給函數之前,nums 在預先未知的某個下標 k0 <= k < nums.length)上進行了 旋轉,使數組變為 [nums[k], nums[k+1], ..., nums[n-1], nums[0], nums[1], ..., nums[k-1]](下標 從 0 開始 計數)。例如, [0,1,2,4,5,6,7] 在下標 3 處經旋轉后可能變為 [4,5,6,7,0,1,2]

給你 旋轉后 的數組 nums 和一個整數 target ,如果 nums 中存在這個目標值 target ,則返回它的下標,否則返回 -1

你必須設計一個時間復雜度為 O(log n) 的算法解決此問題。

示例 1:

輸入:nums = [4,5,6,7,0,1,2], target = 0
輸出:4

示例 2:

輸入:nums = [4,5,6,7,0,1,2], target = 3
輸出:-1

示例 3:

輸入:nums = [1], target = 0
輸出:-1
#include<iostream>
#include<vector>
using namespace std;class Solution {
public:int search(vector<int>& nums, int target) {int l = 0, r = nums.size() - 1;while (l <= r) {int mid = (l + r) / 2;if(nums[mid] == target) return mid;// nums[lo] > target: 目標值小于左邊界// nums[lo] > nums[mid]: 左邊界大于中間值,說明左半部分是無序的// target > nums[mid]: 目標值大于中間值// 這三個條件的異或結果決定了目標值應該在左半部分還是右半部分if ((nums[l] > target) ^ (nums[l] > nums[mid]) ^ (target > nums[mid]))l = mid + 1;elser = mid;}return -1;}
};int main(){
//	vector<int> nums = {4,5,6,7,0,1,2};
//	int target  = 0;
//	vector<int> nums = {3,5,1};
//	int target  = 3;vector<int> nums = {5,1,3};int target  = 5;Solution A;int ans = A.search(nums, target);cout << ans << endl;return 0;
}

hot100_153.尋找旋轉排序數組中的最小值

已知一個長度為 n 的數組,預先按照升序排列,經由 1n旋轉 后,得到輸入數組。例如,原數組 nums = [0,1,2,4,5,6,7] 在變化后可能得到:

  • 若旋轉

    4
    

    次,則可以得到

    [4,5,6,7,0,1,2]
    
  • 若旋轉

    7
    

    次,則可以得到

    [0,1,2,4,5,6,7]
    

注意,數組 [a[0], a[1], a[2], ..., a[n-1]] 旋轉一次 的結果為數組 [a[n-1], a[0], a[1], a[2], ..., a[n-2]]

給你一個元素值 互不相同 的數組 nums ,它原來是一個升序排列的數組,并按上述情形進行了多次旋轉。請你找出并返回數組中的 最小元素

你必須設計一個時間復雜度為 O(log n) 的算法解決此問題。

示例 1:

輸入:nums = [3,4,5,1,2]
輸出:1
解釋:原數組為 [1,2,3,4,5] ,旋轉 3 次得到輸入數組。

示例 2:

輸入:nums = [4,5,6,7,0,1,2]
輸出:0
解釋:原數組為 [0,1,2,4,5,6,7] ,旋轉 4 次得到輸入數組。

示例 3:

輸入:nums = [11,13,15,17]
輸出:11
解釋:原數組為 [11,13,15,17] ,旋轉 4 次得到輸入數組。
class Solution {
public:int findMin(vector<int>& nums) {int low = 0;int high = nums.size() - 1;while (low < high) {int pivot = (low + high) / 2;if (nums[pivot] < nums[high]) high = pivot ;else low = pivot + 1;}return nums[low];}
};

hot100_4.尋找兩個正序數組的中位數、

給定兩個大小分別為 mn 的正序(從小到大)數組 nums1nums2。請你找出并返回這兩個正序數組的 中位數

算法的時間復雜度應該為 O(log (m+n))

示例 1:

輸入:nums1 = [1,3], nums2 = [2]
輸出:2.00000
解釋:合并數組 = [1,2,3] ,中位數 2

示例 2:

輸入:nums1 = [1,2], nums2 = [3,4]
輸出:2.50000
解釋:合并數組 = [1,2,3,4] ,中位數 (2 + 3) / 2 = 2.5
class Solution {
public:int getKthElement(const vector<int>& nums1, const vector<int>& nums2, int k) {int m = nums1.size();int n = nums2.size();int index1 = 0, index2 = 0;while (true) {// 邊界情況if (index1 == m) {return nums2[index2 + k - 1];}if (index2 == n) {return nums1[index1 + k - 1];}if (k == 1) {return min(nums1[index1], nums2[index2]);}// 正常情況int newIndex1 = min(index1 + k / 2 - 1, m - 1);int newIndex2 = min(index2 + k / 2 - 1, n - 1);int pivot1 = nums1[newIndex1];int pivot2 = nums2[newIndex2];if (pivot1 <= pivot2) {k -= newIndex1 - index1 + 1;index1 = newIndex1 + 1;}else {k -= newIndex2 - index2 + 1;index2 = newIndex2 + 1;}}}double findMedianSortedArrays(vector<int>& nums1, vector<int>& nums2) {int totalLength = nums1.size() + nums2.size();if (totalLength % 2 == 1) {return getKthElement(nums1, nums2, (totalLength + 1) / 2);}else {return (getKthElement(nums1, nums2, totalLength / 2) + getKthElement(nums1, nums2, totalLength / 2 + 1)) / 2.0;}}
};

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

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

相關文章

PostgreSQL詳解

第一章&#xff1a;環境部署與基礎操作 1.1 多平臺安裝詳解 Windows環境 圖形化安裝 下載EnterpriseDB安裝包&#xff08;含pgAdmin&#xff09; 關鍵配置項說明&#xff1a; # postgresql.conf優化項 max_connections 200 shared_buffers 4GB work_mem 32MB 服務管理命…

conda install 慢

針對 Solving environment: failed with initial frozen solve. Retrying with flexible solve 錯誤&#xff0c;以下是綜合解決方案&#xff1a; 一、核心解決方法? ?更新 Conda 至最新版本? 舊版本 Conda 的依賴解析算法可能存在缺陷&#xff0c;執行以下命令升級&#…

# 使用自定義Shell腳本hello快速配置Linux用戶賬戶

使用自定義Shell腳本快速配置Linux用戶賬戶 在學校實驗室管理Linux服務器&#xff0c;或者公司小團隊管理服務器時&#xff0c;大家需要一個能隔離自己服務&#xff0c;但是自己又需要對服務器的完整權限的情形。創建和配置用戶賬戶是一項常見但繁瑣的任務。特別是當你需要頻繁…

Unity Animation的其中一種運用方式

Animation是Unity的舊的動畫系統&#xff0c;先說目的&#xff0c;其使用是為了在UI中播放動效&#xff0c;并且在動效播放結束后接自定義事件而設計的 設計的關鍵點在于&#xff0c;這個腳本不是通過Animation直接播放動畫片段&#xff0c;而是通過修改AnimationState的nor…

matplotlib——南丁格爾玫瑰

南丁格爾玫瑰圖&#xff08;Nightingale Rose Chart&#xff09;&#xff0c;是一種特殊形式的柱狀圖&#xff0c;它以南丁格爾&#xff08;Florence Nightingale&#xff09;命名&#xff0c;她在1858年首次使用這種圖表來展示戰爭期間士兵死亡原因的數據。 它將數據繪制在極坐…

TensorFlow面試題及參考答案

目錄 什么是 TensorFlow 的計算圖?詳細描述 TensorFlow 計算圖的組成結構(節點、邊、會話) 它與動態圖(Eager Execution)的區別是什么?TensorFlow 靜態計算圖與動態圖(Eager Execution)的區別及適用場景是什么? 解釋張量(Tensor)的概念及其在 TensorFlow 中的作用…

6.go語言函數

Go語言中的函數是組織代碼的最小單元&#xff0c;用于封裝一段代碼&#xff0c;完成特定的功能。函數的使用可以減少代碼冗余&#xff0c;提高代碼的可讀性和可維護性。 函數的基本定義和語法 在Go語言中&#xff0c;定義一個函數的基本語法如下&#xff1a; func functionN…

SpringCould微服務架構之Docker(4)

Docker ce是社區版。 安裝docker之前&#xff0c;先安裝yum-util 。 安裝docker之前&#xff0c;一定要先關閉防火墻。

Keepalived 實現高可用方案

Keepalived簡介 ?Keepalived? 是一個基于 ?VRRP&#xff08;Virtual Router Redundancy Protocol&#xff09;協議?的高可用性解決方案&#xff0c;主要用于實現?服務故障自動切換&#xff08;Failover&#xff09;和負載均衡?。通過管理虛擬 IP&#xff08;VIP&#xf…

WPS JS宏編程教程(從基礎到進階)--第二部分:WPS對象模型與核心操作

第二部分&#xff1a;WPS對象模型與核心操作 WPS對象的屬性、方法、集合 工作簿對象常用表達方式工作表對象常用表達方式單元格對象常用表達方式 單元格操作實戰 單元格復制與重定位單元格偏移與尺寸調整 顏色設置專題 索引顏色與RGB顏色按條件動態設置單元格顏色 第二部分&…

基于DrissionPage的TB商品信息采集與可視化分析

一、項目背景 隨著電子商務的快速發展,淘寶作為中國最大的電商平臺之一,擁有海量的商品信息。這些數據對于市場分析、用戶行為研究以及競爭情報收集具有重要意義。然而,由于淘寶的反爬蟲機制和復雜的頁面結構,直接獲取商品信息并不容易。尤其是在電商行業高速發展的今天,商…

【003安卓開發方案調研】之ReactNative技術開發安卓

基于2025年最新行業動態和搜索資料&#xff0c;以下是針對國內使用React Native&#xff08;RN&#xff09;開發安卓應用的深度分析&#xff1a; 一、技術成熟度評估 1. 核心架構升級 新架構全面普及&#xff1a;2024年起&#xff0c;React Native的 新架構&#xff08;Fabri…

JS數組方法

數組方法 一、數組 JavaScript 數組的大小是可調整的&#xff0c;并且可以包含不同 數據類型。&#xff08;當不需要這些特性時&#xff0c;請使用 類型數組。&#xff09; 注&#xff1a;JavaScript 類型數組是類似數組的對象&#xff0c;它提供了一種在內存緩沖區中讀取和寫…

【一起學Rust | Tauri2.0框架】深入淺出 Tauri 2.0 應用調試:從新手到專家的蛻變

前言 Tauri 是一款備受矚目的跨平臺桌面應用開發框架&#xff0c;它允許開發者使用 Web 技術棧&#xff08;HTML、CSS、JavaScript&#xff09;構建高性能、安全的原生應用。Tauri 2.0 的發布帶來了諸多令人興奮的新特性和改進&#xff0c;進一步提升了開發體驗和應用性能。然…

Python項目-基于Python的網絡爬蟲與數據可視化系統

1. 項目簡介 在當今數據驅動的時代&#xff0c;網絡爬蟲和數據可視化已成為獲取、分析和展示信息的重要工具。本文將詳細介紹如何使用Python構建一個完整的網絡爬蟲與數據可視化系統&#xff0c;該系統能夠自動從互聯網收集數據&#xff0c;進行處理分析&#xff0c;并通過直觀…

TCP/IP三次握手的過程,為什么要3次?

一&#xff1a;過程 第一次&#xff08;SYN&#xff09;&#xff1a; 客戶端發送一個帶有SYN標志的TCP報文段給服務器&#xff0c;設置SYN1&#xff0c;并攜帶初始序列號Seqx&#xff08;隨機值&#xff09;&#xff0c;進入SYN_SENT狀態。等待服務器相應。 第二次&#xff08…

消息隊列性能比拼: Kafka vs RabbitMQ

本內容是對知名性能評測博主 Anton Putra Kafka vs RabbitMQ Performance 內容的翻譯與整理, 有適當刪減, 相關數據和結論以原作結論為準。 簡介 在本視頻中&#xff0c;我們將首先比較 Apache Kafka 和傳統的 RabbitMQ。然后&#xff0c;在第二輪測試中&#xff0c;會將 Kaf…

打磨和修改:字帖自動生成

功能增加一些。 一個人和大語言模型對話的結果。 不過是重復性勞動&#xff0c;特別需要創意的地方還是不容易做到。

電腦干貨:萬能驅動--EasyDrv8

目錄 萬能驅動EasyDrv8 功能介紹 主程序界面 驅動解壓與安裝 PE環境支持 系統部署環境 桌面環境一鍵解決方案 萬能驅動8電腦版是由IT天空出品的一款智能識別電腦硬件并自動安裝驅動的工具&#xff0c;一般又稱為it天空萬能驅動&#xff0c;萬能驅動vip版&#xff0c;簡稱…

LeetCode熱題100JS(79/100)第十五天|347|295|121|55|45

347. 前 K 個高頻元素 題目鏈接&#xff1a;347. 前 K 個高頻元素 難度&#xff1a;中等 刷題狀態&#xff1a;1刷 新知識&#xff1a; 解題過程 思考 示例 1: 輸入: nums [1,1,1,2,2,3], k 2 輸出: [1,2] 沒思路&#xff0c;看答案 題解分析 參考題解鏈接&#xff1a…