查找算法(Java)

目錄

一.定義

二.分類

三.線性查找

原理:

思路分析

代碼實現

例題實踐

1.兩數之和

方法一:暴力窮舉法

思路分析

代碼實現

方法二:創建哈希表

思路分析

代碼實現

2.移動零

思路分析

代碼實現

四.二分查找

原理:

思路分析

例題實踐

思路分析

代碼實現


一.定義

查找算法是在數據集合中尋找滿足某種條件的數據元素的過程。

二.分類

在Java中我們常見的查找算法有四種:

1.順序(線性)查找

2.二分查找/折半查找

3.插值查找

4.斐波拉契查找

今天我們講前兩個查找算法

三.線性查找

原理:

線性查找是一種簡單的查找算法,它從數據結構的一端開始,逐個檢查每個元素,直到找到所需的元素或搜索到數據結構的另一端。

思路分析

1.從第一個元素開始,逐個與要查找的元素進行比較;如果當前元素不是要查找的元素,則繼續向后查找;

2.如果找到要查找的元素,則返回該元素的位置;如果查找到數據結構的末端仍未找到要查找的元素,則返回一個標識(如-1),表示查找失敗。

代碼實現
public class LookupAlgorithm
{//線性查找方法public static int linearSearch(int[] arr, int key){//循環遍歷數組,找到要查找的值for(int i = 0; i < arr.length; i++){if(arr[i] == key){return i;}}return -1;//找不到返回-1}public static void main (String[] args){int[] arr = {5,6,9,8,6,11,7,56,89};//現在查找56這個元素int index=linearSearch(arr,56);if(index == -1){System.out.println("未找到該元素");}else{System.out.println("該元素的下標為:"+index);}}
}

例題實踐
?

1.兩數之和

給定一個整數數組?nums?和一個整數目標值?target,請你在該數組中找出?和為目標值?target? 的那?兩個?整數,并返回它們的數組下標。你可以假設每種輸入只會對應一個答案,并且你不能使用兩次相同的元素。你可以按任意順序返回答案。

方法一:暴力窮舉法
思路分析

我們可以直接使用嵌套循環,外循環從第一個索引開始,內循環外循環開始的索引處+1開始,一直循環到找出目標值的兩個整數

代碼實現
   //暴力窮舉public static int[] TwoValue(int[] arr, int key){//先定義一個數組,來存儲找到的兩個值的索引int[] result=new int[2];//開始遍歷外循環中的每個元素for(int i = 0; i < arr.length; i++){//內循環從外循環的i位置處的下一個開始遍歷for(int j = i+1; j < arr.length; j++){if(arr[i] +arr[j]==key){result[0]=i;result[1]=j;return result;}}}return result;}
方法二:創建哈希表

關于哈希表的知識點,推薦這篇文章:

https://blog.csdn.net/duan19920101/article/details/51579136?fromshare=blogdetail&sharetype=blogdetail&sharerId=51579136&sharerefer=PC&sharesource=2401_87935803&sharefrom=from_link

思路分析

利用哈希表,將所求差值放入哈希表中,直到找到兩個可以匹配成功的值

代碼實現
//方法二:利用哈希表public static int[] ToSum(int[] arr, int key){//創建哈希表Map<Integer, Integer> hashMap=new HashMap<>();//遍歷數組for(int i = 0; i < arr.length; i++){//計算當前元素與目標值的差值int complement=key-arr[i];//檢查哈希表中是否已存在這個差值作為鍵,如果存在,既找到了目標的兩個數if(hashMap.containsKey(complement)){return new int []{hashMap.get(complement),i};}//如果哈希表不存在這個差值,就將當前元素arr[i]及其索引存入哈希表hashMap.put(arr[i], i);}return new int [] {};}

2.移動零

給定一個數組?nums,編寫一個函數將所有?0?移動到數組的末尾,同時保持非零元素的相對順序。

請注意?,必須在不復制數組的情況下原地對數組進行操作。

思路分析

代碼實現
//移動零public static void moveZeroes(int[] nums) {// 定義一個指針,用于指向當前非零元素應該放置的位置int nonZeroIndex = 0;// 遍歷數組for (int i = 0; i < nums.length; i++) {// 如果當前元素不為0if (nums[i] != 0) {// 將該非零元素放置到nonZeroIndex指向的位置nums[nonZeroIndex] = nums[i];// nonZeroIndex后移一位,為下一個非零元素做準備nonZeroIndex++;}}// 當遍歷完數組后,nonZeroIndex之后的位置都應該填充為0for (int i = nonZeroIndex; i < nums.length; i++) {nums[i] = 0;}}

四.二分查找

原理:

搜索過程從數組的中間元素開始,如果中間元素正好是要查找的元素,則搜索過程結束;
如果某一特定元素大于或小于中間元素,則在數組大于或小于中間元素的那一半中查找,而且此過程可以遞歸進行,直到找到要查找的元素,或者整個數組范圍被搜索完。

思路分析

1.首先確定該數組的中間的下標 mid=(left+right)/2
2.然后讓需要查找的數findVal和arr[mid]比較
2.1 findVal>arr[mid],說明你要查找的數在mid的右邊,因此需要遞歸的向右查找
2.2 findVal<arr[mid],說明你要查找的數在mid的左邊,因此需要遞歸的向左查找
2.3 findVal==arr[mid]說明找到,就返回索引下標

代碼實現

  //二分查找public static int binarySearch(int[] arr, int left, int right, int findVal){//  當left >right時,說明遞歸整個數組,  沒有找到if(left>right){return -1;}int mid = (left + right)/2;int midVal = arr[mid];if(findVal<midVal){return binarySearch(arr, left, mid - 1, findVal);//向左遞歸} else if ( findVal>midVal) //向右遞歸{return binarySearch(arr, mid + 1, right, findVal);}else{return mid;//返回索引}}

例題實踐

搜索插入位置

給定一個排序數組和一個目標值,在數組中找到目標值,并返回其索引。如果目標值不存在于數組中,返回它將會被按順序插入的位置。

請必須使用時間復雜度為?O(log n)?的算法。

思路分析

根據題目可知,本題要用二分查找法

代碼實現
    //搜索插入位置public int searchInsert(int[] nums, int target) {int left=0;//初始化左邊界的第一個位置int right=nums.length-1;//初始化數組的最后一個位置//當左邊界小于右邊界時繼續循環while (left<=right){int mid=(left+right)/2;//找到中間值if(nums[mid]==target){return mid;//如果中間位置等于目標值,則返回} else if (nums[mid]>target) {right=mid-1;//中間值大于目標值,在左半部分查找}else{left=mid+1;//中間值小于目標值,則在右半部分}}return left;//返回左邊界為插入值}

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

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

相關文章

計算機網絡--四層模型,IP地址和MAC地址

四層模型&#xff1a;分別是應用層&#xff0c;傳輸層&#xff0c;網絡層和鏈路層。應用層&#xff1a;提供了應用程序之間相互通信的接口&#xff0c;允許用戶訪問網絡服務。這一層定義了應用程序如何與底層網絡進行交互。例如HTTP協議。傳輸層&#xff1a;它處理數據的分段、…

解析、創建Excel文件的開源庫OpenXLSX介紹

OpenXLSX是一個C庫&#xff0c;用于讀取、寫入、創建和修改.xlsx格式的Microsoft Excel文件&#xff0c;源碼地址&#xff1a;https://github.com/troldal/OpenXLSX &#xff0c;License為BSD-3-Clause&#xff0c;可在Windows、Linux、MaCOS平臺上使用。最新發布版本為v0.3.2&…

【C++】C++11 篇二

【C】C11 篇二前言移動構造函數移動賦值運算符重載類成員變量初始化 &#xff08;缺省值出自C11強制生成默認函數的關鍵字default:禁止生成默認函數的關鍵字delete:繼承和多態中的final與override關鍵字&#xff08;出自C11可變參數模板遞歸函數方式展開參數包逗號表達式展開參…

構建Python環境的幾種工具

本文主要介紹如何構建Python環境來處理不同的工作。 1.常用的構建Python環境的工具 ①venv(內置模塊):Python 3.3 內置標準庫模塊&#xff0c;無需額外安裝。 ②virtualenv:venv的前身&#xff0c;功能更強大且支持舊版Python。 ③conda:來自 Anaconda 或 Miniconda。不僅能…

c#項目編譯時外部依賴文件的同步問題

很多場景因為資源文件太多或太大無法放到資源里面或者是依賴的dll文件&#xff0c;需要編譯時同步到bin\debug或bin\release下的&#xff0c;這里面要修改工程文件代碼實現。 比如&#xff0c;我把這個項目依賴的dll和附加文件放到ref_dll文件夾里面&#xff0c;希望編譯的時候…

數學建模常用算法-模擬退火算法

一、模擬退火算法模擬退火的靈感來源于物理中的 “退火過程”—— 將金屬加熱到高溫后&#xff0c;緩慢冷卻&#xff0c;金屬原子會在熱能作用下自由運動&#xff0c;逐漸形成能量最低的穩定結構。算法將這一過程抽象為數學模型&#xff1a;“溫度 T”&#xff1a;對應物理中的…

架構很簡單:業務架構圖

緣起業務架構是一個復雜的體系&#xff0c;如何更簡單的表達&#xff0c;并能使用起來呢&#xff1f;所謂&#xff1a;大道至簡。基于此&#xff0c;這篇文章就開始了。業務是一切架構的開始&#xff0c;如果沒有業務&#xff0c;架構又有什么作用呢&#xff1f;所以做架構首先…

【前端埋點】純前端實現 A/B Test

“純前端實現 A/B Test”&#xff0c;意思就是 沒有后端分流、也不依賴流量網關&#xff0c;那么只能靠前端邏輯來做“流量切分”。 &#x1f3af; 目標 80% 的用戶 → A 頁面20% 的用戶 → B 頁面且要保證 同一個用戶每次訪問結果一致&#xff08;否則用戶刷新頁面時 A/B 會跳…

Day22_【機器學習—集成學習(3)—Boosting—Adaboost算法】

Adaptive Boosting(自適應提升)是基于 Boosting思想實現的一種集成學習算法&#xff0c;核心思想是通過逐步提高那些被前一步分類錯誤的樣本的權重來訓練一個強分類器。一、Adaboost算法直線相當于一個弱學習器&#xff0c;正確的數據權重減小&#xff0c;錯誤的數據權重增加二…

C#語言入門詳解(18)傳值、輸出、引用、數組、具名、可選參數、擴展方法

C#語言入門詳解&#xff08;18&#xff09;傳值、輸出、引用、數組、具名、可選參數、擴展方法一、傳值參數1. 值類型2. 引用類型&#xff0c;并且創建對象3. 引用類型&#xff0c;不創建對象二、引用參數1. 值類型2. 引用類型&#xff0c;創建新對象3. 引用類型&#xff0c;不…

模型部署:(二)安卓端部署Yolov5-v6.0目標檢測項目全流程記錄

模型部署&#xff1a;&#xff08;二&#xff09;安卓端部署Yolov5-v6.0目標檢測項目全流程記錄1、下載NCNN項目2、下載基于安卓的yolov5項目3、修改相應的配置文件4、將項目打包成apk包5、部署自己訓練的yolov5模型6、相關資料下載&#xff1a;1、下載NCNN項目 # 鏈接地址 ht…

圖形基礎算法:如何將點與帶曲線邊的多邊形位置關系算法做穩定

簡介判斷點與多邊形位置關系算法是幾何算法中最基礎的算法之一&#xff0c;包括布爾運算在內的非常非常多的算法都會用到它。它的穩定是算法庫穩定的關鍵。下面我們從一個邊都是直線的多邊形開始了解射線法的原理。然后看看引入曲線后會帶來哪些問題&#xff0c;以及在實際應用…

react的filber架構

好問題 &#x1f44d; 你問的是 React Fiber 架構。這是 React 16 引入的核心機制&#xff0c;用來解決 React 在大規模更新時的性能問題。下面我給你從 背景 → Fiber 是什么 → 原理 → 優點 → 流程 來系統講。一、為什么需要 Fiber&#xff1f;在 React 15 及以前&#xff…

Lucky STUN穿透結合群暉NAS實現docker下transmission監聽端口動態更新

參考文章 LCUKY系列教程 一 「LUCKY STUN穿透」使用 cURL 自動修改 Transmission 的監聽端口 二 「LUCKY STUN穿透」使用 Webhook 自動修改 qbittorrent 的監聽端口 三 LUCKY STUN穿透在Windows上使用UPnP工具為BT客戶端自動添加內外端口號不同的映射規則 四「LUCKY STUN穿透」…

如何在Ubuntu暢玩鳴潮等游戲

本教程只包括Steam上的游戲。# 更新軟件源 sudo apt update # 安裝Steam sudo apt install steam首先&#xff0c;在Ubuntu的snap商店安裝Steam&#xff0c;啟動&#xff0c;登陸&#xff0c;下載游戲。到這里的操作都比較簡單&#xff0c;對于沒有反作弊的游戲&#xff0c;往往…

機器學習09——聚類(聚類性能度量、K均值聚類、層次聚類)

上一章&#xff1a;機器學習08——集成學習 下一章&#xff1a;機器學習10——降維與度量學習 機器學習實戰項目&#xff1a;【從 0 到 1 落地】機器學習實操項目目錄&#xff1a;覆蓋入門到進階&#xff0c;大學生就業 / 競賽必備 文章目錄一、聚類任務&#xff08;無監督學習…

解決 Docker 構建中 Python 依賴沖突的完整指南

問題背景 在基于 registry.cn-shenzhen.aliyuncs.com/all_dev/dev:invoice-base 鏡像構建 Docker 容器時,我們遇到了一個常見的 Python 依賴管理問題: ERROR: ResolutionImpossible: for help visit https://pip.pypa.io/en/latest/topics/dependency-resolution/#dealing-…

光子計算芯片實戰:Lightmatter Passage互連架構性能評測

點擊 “AladdinEdu&#xff0c;同學們用得起的【H卡】算力平臺”&#xff0c;H卡級別算力&#xff0c;80G大顯存&#xff0c;按量計費&#xff0c;靈活彈性&#xff0c;頂級配置&#xff0c;學生更享專屬優惠。 摘要 隨著人工智能計算需求呈指數級增長&#xff0c;傳統電子計算…

基于樹莓派與Jetson Nano集群的實驗邊緣設備上視覺語言模型(VLMs)的性能評估與實踐探索

概述 2018年&#xff0c;TensorFlow Lite團隊的Pete Warden曾提出&#xff1a;“機器學習的未來在于微型化”。如今&#xff0c;隨著人工智能向高性能視覺強大的視覺語言模型&#xff08;Vision-language models, VLMs&#xff09;發展&#xff0c;對高性能計算資源的需求急劇…

華為Ai崗機考20250903完整真題

華為Ai崗機考20250903 華為自26屆秋招&#xff08;2025年起&#xff09;對AI崗位機考進行了改革&#xff0c;考試題型調整為20道選擇題&#xff08;15道單選(6分)5道不定項選擇(12分)&#xff09;2道編程題(150300)。 題目核心圍繞人工智能技術&#xff08;如Transformer架構…