Java【數據結構】二分查找

🌞 題目:

🌏在有序數組A中,查找目標值target
🌏如果找到返回索引
🌏如果找不到返回-1

算法描述解釋
前提給定一個內含n個元素的有序數組A,滿足A0<=A1<=A2<=·······<=An-1,一個待查值target
1設置left=0;right = n - 1
2如果left > right ,結束查找,沒找到
3設置mid = (left + right )/2,mid為中間索引
4如果target < Am,設置right = mid -1,跳到第2步
5如果target > Am,設置left = mid +1,跳到第2步
6如果Am = target,結束查找,找到了

算法實現

 public  int binarySearch(int[] arr,int target) {int left = 0;int right = arr.length-1;while(left<=right) {int mid = (left+right)>>>1;if(target < arr[mid]) {right = mid - 1;}else if (arr[mid] < target) {left = mid + 1;}else {return mid;}}return -1;}

注解:

1.為什么while循環條件是left<=right,而不是left<right?
因為當left=right時,mid=left=right可能為我們想要查找的值

2.為什么mid = (left+right)>>>1,而不是(left+right)/2呢? >>>是無符號右移,無符號右移一位相當于除2取整。 不用(left+right)/2原因是,當left+right的值超過int類型的正整數最大范圍,其值就會由正變負

在其他的資料中二分查找與這個代碼不一樣,

?? 二分查找的改動版

public static int binarySearch1(int[] arr,int target) {int left=0;int right = arr.length;      //第一處改動while(left < right) {        //第二處改動int mid = (left+right)>>>1;if(target < arr[mid]) {right = mid;          //第三處改動}else if (arr[mid] < target) {left = mid + 1;}else {return mid;}}return -1;}

??注解

right=arr.length,作為一個邊界存在,left可能為我們的查找目標,但是right一定不是我們要找到的目標

🚀圖解演示:

查找13
在這里插入圖片描述

??在Java中其實已經提供了二分查找的方法binarySearch

public class Test {public static void main(String[] args) {int[] arr ={1,2,3,4,5,5,6};int target = Arrays.binarySearch(arr,3);System.out.println(target);}
}

🚠運行結果:

2

在這里插入圖片描述

🚩二分查找對重復元素的處理

📍重復元素最靠右的元素

說明:查找元素為重復元素的話,會查找到最右邊的重復元素
Returns:
找到則返回最靠右索引
找不到返回-1

//重復元素最靠右的元素
public class Test5 {public static int binarySearch2(int[] arr,int target) {int left = 0;int right = arr.length-1;int cand = -1;while (left <= right) {int mid = (left + right)>>>1;if(target < arr[mid]) {right = mid-1;} else if (arr[mid] < target) {left = mid+1;}else {cand = mid;left = mid+1;}}return cand;}
}

說明:返回<=target的最右邊的索引
Returns:
找到則返回最靠右索引
找不到返回小于target最右邊的索引

 public static int binarySearchRightMost(int[] arr,int target){int left = 0;int right = arr.length-1;while(left <= right) {int mid = (left + right )>>>1;if(target < arr[mid]){right = mid-1;}else {left = mid + 1;}}return left-1;}

📍重復元素最靠左的元素

說明:查找元素為重復元素的話,會查找到最左邊的重復元素
Returns:
找到則返回最靠左索引
找不到返回-1

 public static int binarySearch2(int[] arr,int target) {int left = 0;int right = arr.length-1;int cand = -1;while (left <= right) {int mid = (left + right)>>>1;if(target < arr[mid]) {right = mid-1;} else if (arr[mid] < target) {left = mid+1;}else {cand = mid;right = mid - 1;}}return cand;}

說明:
返回>=target最左邊的索引
Returns:
找到則返回最靠左索引
找不到返回比target大的最左邊索引

 public static int binarySearchLeftMost(int[] arr,int target) {int left=0;int right = arr.length-1;while(left <= right) {int mid = (left + right)>>>1;if(target <= arr[mid]) {right = mid - 1;}else  {left = mid + 1;}}return left;}

圖解:
在這里插入圖片描述

🚆leetcode二分查找題

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

提示:
你可以假設 nums 中的所有元素是不重復的。
n 將在 [1, 10000]之間。
nums 的每個元素都將在 [-9999,9999]之間。

class Solution {public int search(int[] nums, int target) {int i=0;int j = nums.length-1;while(i<=j){int m=(i+j)>>>1;if(target<nums[m]){j=m-1;}else if(nums[m]<target){i=m+1;}else{return m;}}return -1;}
}

2??2.給定一個排序的整數數組 nums 和一個整數目標值 target ,請在數組中找到 target ,并返回其下標。如果目標值不存在于數組中,返回它將會被按順序插入的位置。
請必須使用時間復雜度為 O(log n) 的算法。
? 鏈接: 搜索插入位置

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

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

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

你必須設計并實現時間復雜度為 O(log n) 的算法解決此問題。
? 鏈接: 在排序數組中查找元素的第一個和最后一個位置

class Solution {public int[] searchRange(int[] nums, int target) {int x=left(nums,target);if(x==-1){return new int[]{-1,-1};}else{return new int[]{x,right(nums,target)};}}public int left(int[] nums,int target) {int i=0;int j=nums.length-1;int cand=-1;while(i<=j){int  m=(i+j)>>>1;if(target<nums[m]){j=m-1;}else if(nums[m]<target){i=m+1;}else{cand=m;j=m-1;}}return cand;}public int right(int[] nums,int target) {int i=0;int j=nums.length-1;int cand=-1;while(i<=j){int  m=(i+j)>>>1;if(target<nums[m]){j=m-1;}else if(nums[m]<target){i=m+1;}else{cand=m;i=m+1;}}return cand;}
}

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

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

相關文章

mysql 8.0安裝

操作系統&#xff1a;22.04.1-Ubuntu apt 安裝命令 sudo apt install mysql-client-core-8.0 sudo apt install mysql-server-8.0終端輸入 mysql 可以直接免密登錄 如果此時提示需要密碼&#xff0c;則可以進入配置文件&#xff0c;設置免密登錄 sudo vim /etc/mysql/mysq…

【探索Linux】—— 強大的命令行工具 P.5(yum工具、git 命令行提交代碼)

閱讀導航 前言一、軟件包管理器 yum1.yum的概念yum的基本指令使用例子 二、git 命令行提交代碼總結溫馨提示 前言 前面我們講了C語言的基礎知識&#xff0c;也了解了一些數據結構&#xff0c;并且講了有關C的一些知識&#xff0c;也學習了一些Linux的基本操作&#xff0c;也了…

第3章 CPU微架構

3.1 指令集架構 指令集ISA是軟件用來與硬件通信的詞匯集合&#xff0c;定義了軟件和硬件之間的通信協議。Intel x86、ARM v8、RISC-V是當今廣泛使用指令集架構的實例。ISA開發者通常要確保符合規范的軟件或固件能在使用該規范構建的任何處理器上執行。廣泛部署的ISA組織通常還…

20W IP網絡吸頂喇叭 POE供電吸頂喇叭

SV-29852T 20W IP網絡吸頂喇叭產品簡介 產品用途&#xff1a; ◆室內豪華型吸頂喇叭一體化網絡音頻解碼揚聲器&#xff0c;用于廣播分區音頻解碼、聲音還原作用 ◆應用場地如火車站、地鐵、教堂、工廠、倉庫、公園停車場等&#xff1b;室內使用效果均佳。 產品特點&#xff…

vue-router中的一些 API

在Vue.js的vue-router中&#xff0c;一些重要api 1、RouterHistory&#xff1a;這是 vue-router 提供的路由歷史記錄對象。它可以跟蹤當前頁面的路由歷史&#xff0c;并提供一些方法和屬性來管理導航和歷史記錄。在 vue-router 中&#xff0c;有兩種類型的路由歷史記錄對象&…

pytorch_lightning報錯 You requested gpu: [1],But your machine only has: [0]

pytorch_lightning報錯 You requested gpu: [1]&#xff0c;But your machine only has: [0] 問題及分析 報錯圖片如下&#xff1a; 分析 gpu:[1]指代的gpu的標號&#xff0c;如果筆記本中只包含一個GPU&#xff0c;一般序號為[0].所以無法找到程序指定的GPU。 解決方法 …

機器學習之邏輯回歸

import numpy as np import pandas as pd from sklearn.model_selection import train_test_split from sklearn.preprocessing import StandardScaler from sklearn.linear_model import LogisticRegression # 獲得數據 names[Sample code number,Clump Thickness,Uniformity…

編程語言學習筆記-架構師和工程師的區別,PHP架構師之路

&#x1f3c6;作者簡介&#xff0c;黑夜開發者&#xff0c;全棧領域新星創作者?&#xff0c;CSDN博客專家&#xff0c;阿里云社區專家博主&#xff0c;2023年6月CSDN上海賽道top4。 &#x1f3c6;數年電商行業從業經驗&#xff0c;歷任核心研發工程師&#xff0c;項目技術負責…

Egg.js構建一個stream流式接口服務

經常需要用到 stream 流式接口服務,比如&#xff1a;大文件下載、日志實時輸出等等。本文將介紹如何使用Egg.js構建一個 stream 流式接口服務。 一、準備工作 目錄結構&#xff1a; app//controllerindex.jstest.txttest.shindex.js 控制器test.txt 測試文件&#xff0c;最好…

5G+AI數字化智能工廠建設解決方案PPT

導讀&#xff1a;原文《5GAI數字化智能工廠建設解決方案》&#xff08;獲取來源見文尾&#xff09;&#xff0c;本文精選其中精華及架構部分&#xff0c;邏輯清晰、內容完整&#xff0c;為快速形成售前方案提供參考。數字化智能工廠定義 智能基礎架構協同框架 - 端、邊、云、網…

激光雷達 01 線數

一、線數 對于 360 旋轉式和一維轉鏡式架構的激光雷達來說&#xff0c;有幾組激光收發模塊&#xff0c;垂直方向上就有幾條線&#xff0c;被稱為線數。這種情況下&#xff0c;線數就等同于激光雷達內部激光器的數量[參考]。 通俗來講&#xff0c;線數越高&#xff0c;激光器的…

npm run xxx 的時候發生了什么?(以npm run dev舉例說明)

文章目錄 一、去package.json尋找scripts對應的命令二、去node_modules尋找vue-cli-service三、從package-lock.json獲取.bin的軟鏈接1. bin目錄下的那些軟連接存在于項目最外層的package-lock.json文件中。2.vue-cli-service文件的作用3.npm install 的作用 總結 一、去packag…

Google API實戰與操作

Google api實戰與操作 一. Google API 權限配置二. 操作API2.1 引入依賴2.2 導入代碼 Google官網 實現一套用java程序控制GoogleAPI實現自動生成監控日報等功能,具體能操作Gsheet及document 一. Google API 權限配置 打開上面官網,新建項目 啟用API 搜索sheet及document …

【山河送書第七期】:《強化學習:原理與Python實戰》揭秘大模型核心技術RLHF!

《強化學習&#xff1a;原理與Python實戰》揭秘大模型核心技術RLHF&#xff01; 一圖書簡介二RLHF是什么&#xff1f;三RLHF適用于哪些任務&#xff1f;四RLHF和其他構造獎勵模型的方法相比有何優劣&#xff1f;五什么樣的人類反饋才是好反饋&#xff1f;六如何減小人類反饋帶來…

LVGL圖層的介紹

一.UI界面顯示的圖層 在lvgl開發的過程中&#xff0c;UI界面的顯示都是位于lv_sct_act()圖層 二.彈窗顯示 lvgl開發過程中&#xff0c;有些窗口有可能在任何時候顯示&#xff0c;比如錯誤信息彈窗&#xff0c;外部觸發的一些中斷。 這個時候&#xff0c;這些窗口不能建立在lv_s…

web前端開發基礎入門html5+css3+js學習筆記(一)

目錄 1.第一個前端程序2.前端工具的選擇與安裝3.VSCode開發者工具快捷鍵4.HTML5簡介與基礎骨架4.1 HTML5的DOCTYPE聲明4.2 HTML5基本骨架4.2.1 html標簽4.2.2 head標簽4.2.3 body標簽4.2.4 title標簽4.2.5 meta標簽 5.標簽之標題5.1 快捷鍵5.1 標題標簽位置擺放 6.標簽之段落、…

LeetCode每日一題——2682. 找出轉圈游戲輸家

n 個朋友在玩游戲。這些朋友坐成一個圈&#xff0c;按 順時針方向 從 1 到 n 編號。從第 i 個朋友的位置開始順時針移動 1 步會到達第 (i 1) 個朋友的位置&#xff08;1 < i < n&#xff09;&#xff0c;而從第 n 個朋友的位置開始順時針移動 1 步會回到第 1 個朋友的位…

leetcode 377. 組合總和 Ⅳ

2023.8.17 本題屬于完全背包問題&#xff0c;乍一看和昨天那題 零錢兌換II 類似&#xff0c;但細看題目發現&#xff1a;今天這題是排列問題&#xff0c;而“零錢兌換II”是組合問題。排列問題強調順序&#xff0c;而組合順序不強調順序。 這里先說個結論&#xff1a;先遍歷物品…

并查集、樹狀數組

并查集、樹狀數組、線段樹 并查集樹狀數組樹狀數組1 (單點修改&#xff0c;區間查詢)樹狀數組2 (單點查詢&#xff0c;區間修改) 并查集 【模板】并查集 題目描述 如題&#xff0c;現在有一個并查集&#xff0c;你需要完成合并和查詢操作。 輸入格式 第一行包含兩個整數 …

Scala中的Either的用法

在 Scala 中&#xff0c;Either 是一種表示兩種可能值的數據類型。它可以用來處理函數可能返回的兩種不同類型的結果&#xff0c;通常用于錯誤處理或者結果分支情況。Either 有兩個子類&#xff1a;Left 和 Right&#xff0c;其中 Left 通常用于表示錯誤或異常情況&#xff0c;…