查找算法(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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈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架构…