常见算法(1)

news2025/1/18 12:01:49

1.基本查找/顺序查找

核心:从0索引之后挨个查找

实现代码:

public class test {
		public static void main(String [] arg) throws ParseException  {
		  int[] arr= {121,85,46,15,55,77,63,49};
		  int number=55;
		  System.out.println(bashi(arr,number));
		}
		public static boolean bashi(int []arr,int number) {
			for(int i=0;i<arr.length;i++) {
				if(number==arr[i]) {
					return true;
				}
			}
			return false;
		}
}

查找某个数据的索引,若考虑数据重复问题,则需要使用集合,将数据索引放入集合中。

public class test {
		public static void main(String [] arg) throws ParseException  {
			//返回数据的索引,需要考虑数据重复问题
		  int[] arr= {121,85,46,15,55,77,63,49,55};
		  int number=55;
		  System.out.println(bashi(arr,number));
		}
		public static ArrayList<Integer> bashi(int []arr, int number) {
			ArrayList<Integer> list=new ArrayList();
			for(int i=0;i<arr.length;i++) {
				if(number==arr[i]) {
					list.add(i);
				}
			}
			return list;
		}
}

2.二分查找

前提条件:数组中的数据必须是有序的

核心:每次排除一半的查找范围

定义min、max、mid

若查找元素在mid左边,min不变,max=mid-1;

若查找元素在mid右边,max不变,min=mid+1;

实现代码:

public class test {
		public static void main(String [] arg) throws ParseException  {
		  int[] arr= {12,35,46,62,88,97,150};
		  int number=88;
		  System.out.println(binary(arr,number));
		}
		public static int binary(int []arr, int number) {
			int min=0;
			int max=arr.length-1;
			while(true) {
				if(min>max) {
					return -1;
				}
				int mid=(min+max)/2;
				if(arr[mid]<number) {
					min=mid+1;
				}else if(arr[mid]>number) {
					max=mid-1;
				}else {
					return mid;
				}
			}
		}
}

3.分块查找

原则:1.前一块中的最大数据,小于后一块中的所有数据;2.块数数量一般等于这个数字的个数开根号。

核心:先确定查找的是那一块,然后在块内挨个查找

分析:

先创建一个Block类,有max(最大值),startindex(起始索引),endindex(结束索引);

再创建一个block数组,存放创建的对象;

定义方法查找元素下标,还有一个方法查找元素在哪一块:遍历block数组,查找最大值小于元素的块(下标)。得到哪一块,获取起始索引,遍历,在arr中查找元素下标。

public class test {
		public static void main(String [] arg)   {
		  int[] arr= {16,5,9,12,21,18,
				     32,23,37,26,45,34,
				     50,48,61,52,73,66};
		  
		  //分块查找:
		  //建立一个Block类
		  //创建Blockarr数组,存放每个对象的信息
		  //先查找元素是那一层的
		  //再遍历这一层查找元素索引
		  
		  Block b1=new Block(21,0,5); //创建对象
		  Block b2=new Block(45,6,11);
		  Block b3=new Block(66,12,17);
		  //定义一个数组管理三个块
		  Block []block= {b1,b2,b3};
		  System.out.println(find(block,arr,61));
		
		}
		public static int find(Block []block,int[] arr,int number) { 
			int index=ceng(block,number);//查到在哪一层
			if(index==-1) {
				return -1;
			}
			//获取这一层的起始和结束索引
			int startindex=block[index].getStart();
			int endindex=block[index].getEnd();
			//遍历arr
			for(int i=startindex;i<endindex;i++) {
				if(arr[i]==number) {
					return i;
				}
			}
			return -1;
		}
		//查找元素在那一层
		public static int ceng(Block []block,int number) {
			for(int i=0;i<block.length;i++) {
				if(block[i].getMax()>=number) {
					return i;
				}
			}
			return -1;
		}
}
class Block{
	private int max;//每层的最大值
	private int start;//起始索引
	private int end;//结束索引
	public Block() {
		
	}
	public Block(int max,int start,int end) {
		this.setMax(max);
		this.setStart(start);
		this.setEnd(end);
	}
	public int getMax() {
		return max;
	}
	public void setMax(int max) {
		this.max = max;
	}
	public int getStart() {
		return start;
	}
	public void setStart(int start) {
		this.start = start;
	}
	public int getEnd() {
		return end;
	}
	public void setEnd(int end) {
		this.end = end;
	}
	
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1682475.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

el-upload上传图片,视频可获取视频时长。

对element-ui组件的upload组件再一次封装&#xff0c;简单记录。下面是效果图。 注意点&#xff1a;该组件现在仅支持单图和单个视频上传。 <template><div :style"myStyle"><divclass"uploads":style"{width: upWith px,height: up…

多商户消费券系统源码(ThinkPHP+FastAdmin+微信公众号)

打造智能促销新体验 一、引言&#xff1a;消费券系统的时代意义 在当今这个数字化高速发展的时代&#xff0c;电子商务和移动支付已经成为人们日常生活的重要组成部分。随着市场竞争的加剧&#xff0c;多商户消费券系统作为一种创新的促销手段&#xff0c;正逐渐受到商家和消…

容器监控方案

1、docker部署prometheus Prometheus是一套开源的系统监控报警框架&#xff0c;它基于时序数据库&#xff0c;并通过HTTP协议周期性地从被监控的组件中抓取指标数据。以下是一些关于Prometheus的详细介绍&#xff1a; 基本概念&#xff1a;Prometheus所有采集的监控数据均以指…

Swift使用JSONDecoder处理json数据,实现json序列化和反序列化

Json数据处理是开发中不可获取的一项技能&#xff0c;如果你不会处理json数据&#xff0c;那你离失业就不远了&#xff0c;所以学完了swift基础教程&#xff0c;还是先老老实实学习一下json处理吧&#xff0c;有了这项技能&#xff0c;你才可以继续下一个网络请求阶段的开发&am…

深度学习之基于YoloV5车型识别系统

欢迎大家点赞、收藏、关注、评论啦 &#xff0c;由于篇幅有限&#xff0c;只展示了部分核心代码。 文章目录 一项目简介 二、功能三、系统四. 总结 一项目简介 一、项目背景与意义 在智能交通、安全监控等领域&#xff0c;车型识别技术具有重要的应用价值。传统的车型识别方法…

栈(基于动态顺序表实现的栈)

栈的简单介绍 关于栈的性质咳咳 栈&#xff1a;栈是一种特殊的线性表,其中只让在一端插入和删除元素。 后进先出 进行插入删除的那一端叫栈顶&#xff0c;另一端叫栈底 我们实现的栈是基于一个动态顺序表的的栈&#xff0c;会实现栈的 入栈&#xff0c;出栈&#xff0c;获取…

【NumPy】关于numpy.eye()函数,看这一篇文章就够了

&#x1f9d1; 博主简介&#xff1a;阿里巴巴嵌入式技术专家&#xff0c;深耕嵌入式人工智能领域&#xff0c;具备多年的嵌入式硬件产品研发管理经验。 &#x1f4d2; 博客介绍&#xff1a;分享嵌入式开发领域的相关知识、经验、思考和感悟&#xff0c;欢迎关注。提供嵌入式方向…

15:00面试,15:08就出来了,问的问题有点变态。。。

从小厂出来&#xff0c;没想到在另一家公司又寄了。 到这家公司开始上班&#xff0c;加班是每天必不可少的&#xff0c;看在钱给的比较多的份上&#xff0c;就不太计较了。没想到8月一纸通知&#xff0c;所有人不准加班&#xff0c;加班费不仅没有了&#xff0c;薪资还要降40%…

【重学C++】02 脱离指针陷阱:深入浅出 C++ 智能指针

前言 大家好&#xff0c;今天是【重学C】系列的第二讲&#xff0c;我们来聊聊C的智能指针。 为什么需要智能指针 在上一讲《01 C如何进行内存资源管理》中&#xff0c;提到了对于堆上的内存资源&#xff0c;需要我们手动分配和释放。管理这些资源是个技术活&#xff0c;一不…

Thinkphp内核开发盲盒商城源码v2.0 对接易支付/阿里云短信/七牛云存储

源码简介 这套系统是我从以前客户手里拿到的,100完整可用,今天测试防红链接失效了,需要修改防红API即可!前端页面展示我就不放了,懂的都懂 优点是Thinkphp开发的&#xff0c;二开容易。 源码图片 资源获取&#xff1a;Thinkphp内核开发盲盒商城源码v2.0 对接易支付/阿里云短…

浅谈hook下的免杀研究

文章目录 前记实现过程后记reference 前记 原理 CS在高版本中推出了sleep mask功能&#xff0c;即在beacon sleep时对堆进行加密混淆&#xff0c;绕过内存扫描&#xff0c;在恢复运行前还原&#xff0c;防止进程崩溃。beacon每次运行的时间远短于sleep时间&#xff0c;内存扫描…

python实现520表白图案

今天是520哦&#xff0c;作为程序员有必要通过自己的专业知识来向你的爱人表达下你的爱意。那么python中怎么实现绘制520表白图案呢&#xff1f;这里给出方法&#xff1a; 1、使用图形库&#xff08;如turtle&#xff09; 使用turtle模块&#xff0c;你可以绘制各种形状和图案…

GPT‑4o普通账户也可以免费用

网址 https://chatgpt.com/ 试了一下&#xff0c;免费的确实显示GPT‑4o的模型&#xff0c;问了一下可以联网&#xff0c;不知道能不能通过插件出图 有兴趣的可以试试

海山数据库(He3DB)代理ProxySQL使用详解:(一)架构说明与安装

一、ProxySQL介绍 1.1 简介 业界比较知名的MySQL代理&#xff0c;由ProxySQL LLC公司开发并提供专业的服务支持&#xff0c;基于GPLv3开源协议进行发布,大部分配置项可动态变更。后端的MySQL实例可根据用途配置到不同的hostgroup中&#xff0c;由ProxySQL基于7层网络协议,将来…

第二证券股市资讯:突传重磅!高盛最新发声,事关中国股票!

外资猛买我国财物。 高盛在最新发布的陈述中称&#xff0c;海外对冲基金已连续第四周增持我国股票。另据彭博社的数据显现&#xff0c;上星期&#xff0c;我国是新式商场国家中录得最大资金流入的商场&#xff0c;达4.88亿美元&#xff08;约合人民币35亿元&#xff09;。 北…

滴滴三面 | Go后端研发

狠狠的被鞭打了快两个小时… 注意我写的题解不一定是对的&#xff0c;如果你认为有其他答案欢迎评论区留言 bg&#xff1a;23届 211本 社招 1. 自我介绍 2. 讲一个项目的点&#xff0c;因为用到了中间件平台的数据同步&#xff0c;于是开始鞭打数据同步。。 3. 如果同步的时候…

OpenFeign高级用法:缓存、QueryMap、MatrixVariable、CollectionFormat优雅地远程调用

码到三十五 &#xff1a; 个人主页 微服务架构中&#xff0c;服务之间的通信变得尤为关键。OpenFeign&#xff0c;一个声明式的Web服务客户端&#xff0c;使得REST API的调用变得更加简单和优雅。OpenFeign集成了Ribbon和Hystrix&#xff0c;具有负载均衡和容错的能力&#xff…

LInux实验二--进程间通信--信号

一、实验原理&#xff1a; 信号类似 windows 下的消息,用于通知进程有某种事件发生。只要知道进程的进 程号,就可以向进程发送信号。而进程可以自行定义对信号的处理方法。 二、实验内容&#xff1a; 实例一&#xff1a;编写实例&#xff0c;让子进程在启动2s后杀死父进程 /…

Docker Portainer使用

Portainer是什么 Docker Portainer是一个轻量级的 Web UI 管理界面,可以用来管理Docker环境。它提供了一个直观的控制台,用户可以通过它来管理Docker主机、容器、网络、卷等Docker资源。 Portainer的主要功能和特点包括: 容器管理:可以查看、启动、停止、删除容器,以及查看容器…

跳过无限debugger实战——替换和条件断点实战

网址&#xff1a;Scrape | Movie 打卡开发者工具&#xff1a; debugger代码及含义 setInterval((function() {debugger ;console.log("debugger")} function()是要执行的函数。interval是每次执行之间的时间间隔&#xff0c;以毫秒为单位。 你可以用想要的时间间隔…