基础算法整理

二分查找:

public class BinarySearch {//1、普通的二分查找public static int binarySearch(int[] arr,int target){if(arr.length==0) return -1;int left=0,right=arr.length-1;while(left<=right){int mid=left+(right-left)/2;if(arr[mid]==target){return mid;}else if(arr[mid]<target){left=mid+1;}else{right=mid-1;}}return -1;}//2、寻找左边界public static int left_bound(int[] nums, int target) {int left = 0, right = nums.length - 1;while (left <= right) {int mid = left + (right - left) / 2;if (nums[mid] < target) {left = mid + 1;} else if (nums[mid] > target) {right = mid - 1;} else if (nums[mid] == target) {// 别返回,锁定左侧边界right = mid - 1;}}// 最后要检查 left 越界的情况if (left >= nums.length || nums[left] != target)return -1;return left;}//3、寻找右边界public static int right_bound(int[] nums, int target) {int left = 0, right = nums.length - 1;while (left <= right) {int mid = left + (right - left) / 2;if (nums[mid] < target) {left = mid + 1;} else if (nums[mid] > target) {right = mid - 1;} else if (nums[mid] == target) {// 别返回,锁定右侧边界left = mid + 1;}}// 最后要检查 right 越界的情况if (right < 0 || nums[right] != target)return -1;return right;}
}

快排:

public class QuickSort {public static void quickSort(int[] array,int low,int high){if(low<high){//寻找基准数据的正确索引int index=getIndex(array,low,high);//分治quickSort(array,low,index-1);quickSort(array,index+1,high);}}public static int getIndex(int[] array,int low,int high){//基准数据int tmp=array[low];while(low<high){//当队尾的元素大于等于基准数据时,向前挪动high指针while(low<high&&array[high]>=tmp){high--;}// 如果队尾元素小于tmp了,需要将其赋值给lowarray[low]=array[high];// 当队首元素小于等于tmp时,向前挪动low指针while(low<high&&array[low]<=tmp){low++;}// 当队首元素大于tmp时,需要将其赋值给higharray[high]=array[low];}// 跳出循环时low和high相等,此时的low或high就是tmp的正确索引位置array[low]=tmp;return low;}
}

归并排序:

public class MergeSort {public static int[] mergeSort(int[] array){if(array.length<2) return array;int mid=array.length/2;int[] left= Arrays.copyOfRange(array,0,mid);int[] right=Arrays.copyOfRange(array,mid,array.length);return merge(mergeSort(left),mergeSort(right));}public static int[] merge(int[] left,int[] right){int[] result=new int[left.length+right.length];for(int index=0,i=0,j=0;index<result.length;index++){if(i>=left.length)result[index]=right[j++];else if(j>=right.length)result[index]=left[i++];else if(left[i]>right[j])result[index]=right[j++];elseresult[index]=left[i++];}return result;}
}

堆排序:

public class HeapSort {public static int len;public static int[] heapSort(int[] array){len=array.length;if(len<1) return array;//构建最大堆buildMaxHeap(array);//依次将最大堆的元素移至数组尾部,并维护最大堆while(len>0){int temp=array[len-1];array[len-1]=array[0];array[0]=temp;len--;adjustHeap(array,0);}return array;}public static void buildMaxHeap(int[] array){len= array.length;//从最后一个非叶子节点开始向上构造最大堆for (int i = (len/2- 1); i >= 0; i--) {adjustHeap(array, i);}}public static void adjustHeap(int[] array, int i) {//指向最大值的指针int maxIndex = i;//i的左子树和右子树分别2i+1和2(i+1)int left=i * 2 + 1;int right=i * 2 + 2;//如果有左子树,且左子树大于父节点,则将最大指针指向左子树if (left < len && array[left] > array[maxIndex])maxIndex = left;//如果有右子树,且右子树大于父节点,则将最大指针指向右子树if (right < len && array[right] > array[maxIndex])maxIndex = right;//如果父节点不是最大值,则将父节点与最大值交换,并且递归调整与父节点交换的位置。if (maxIndex != i) {int temp=array[maxIndex];array[maxIndex]=array[i];array[i]=temp;adjustHeap(array, maxIndex);}}
}

树的三种遍历(递归和迭代):

二叉树的前序遍历:根 左 右
递归

class Solution {public List<Integer> preorderTraversal(TreeNode root) {List<Integer>res=new ArrayList<>();preorder(root,res);return res;}public void preorder(TreeNode root,List<Integer>list){if(root==null) return;list.add(root.val);preorder(root.left,list);preorder(root.right,list);}
}

迭代:队列存取右子树

class Solution {public List<Integer> preorderTraversal(TreeNode root) {List<Integer>res=new ArrayList<>();Deque<TreeNode>stack=new LinkedList<>();TreeNode temp=root;while(temp!=null||!stack.isEmpty()){while(temp!=null){stack.addFirst(temp.right);res.add(temp.val);temp=temp.left;}temp=stack.removeFirst();}return res;}
}

二叉树的中序遍历:左 根 右
递归

class Solution {public List<Integer> preorderTraversal(TreeNode root) {List<Integer>res=new ArrayList<>();preorder(root,res);return res;}public void preorder(TreeNode root,List<Integer>list){if(root==null) return;preorder(root.left,list);list.add(root.val);preorder(root.right,list);}
}

迭代:队列存取根

class Solution {public List<Integer> inorderTraversal(TreeNode root) {List<Integer>res=new ArrayList<>();Deque<TreeNode>queue=new LinkedList<>();TreeNode temp=root;while(temp!=null||!queue.isEmpty()){while(temp!=null){queue.addFirst(temp);temp=temp.left;}temp=queue.removeFirst();res.add(temp.val);temp=temp.right;}return res;}
}

二叉树的后序遍历:左 右 根
递归

class Solution {public List<Integer> preorderTraversal(TreeNode root) {List<Integer>res=new ArrayList<>();preorder(root,res);return res;}public void preorder(TreeNode root,List<Integer>list){if(root==null) return;preorder(root.left,list);preorder(root.right,list);list.add(root.val);}
}

迭代,后续遍历结果的逆序为根 右 左,参考前序遍历根 左 右

class Solution {public List<Integer> postorderTraversal(TreeNode root) {List<Integer>res=new ArrayList<>();Deque<TreeNode>queue=new LinkedList<>();TreeNode temp=root;while(temp!=null||!queue.isEmpty()){while(temp!=null){queue.addFirst(temp.left);res.add(temp.val);temp=temp.right;}temp=queue.removeFirst();}Collections.reverse(res);return res;}
}

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

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

一键导出数据库表到Excel

工作中&#xff0c;我们经常需要将数据库表导出到Excel&#xff0c;通常我们会用数据库编辑器之类的工具提供的导出功能来导出&#xff0c;但是它们的导出功能通常都比较简单。 这篇文章将介绍一种简单易用并且功能强大的导出方法。 新增导出 打开的卢导表工具&#xff0c;新…

《深度学习实战》第4集:Transformer 架构与自然语言处理(NLP)

《深度学习实战》第4集&#xff1a;Transformer 架构与自然语言处理&#xff08;NLP&#xff09; 在自然语言处理&#xff08;NLP&#xff09;领域&#xff0c;Transformer 架构的出现彻底改变了传统的序列建模方法。它不仅成为现代 NLP 的核心&#xff0c;还推动了诸如 BERT、…

jeecgboot项目idea启动项目(二)

文章目录 一、IntelliJ IDEA1.安装2.配置maven3.配置jdk 二、IDEA启动项目三、IDEA2024.1.4破解 一、IntelliJ IDEA ‌IntelliJ IDEA是一款由JetBrains开发的集成开发环境&#xff08;IDE&#xff09;&#xff0c;主要用于Java和Kotlin编程&#xff0c;但也支持多种其他编程语…

fody引用c++的dll合并后提示找不到

fody引用c的dll合并后提示找不到 解决方案&#xff1a; 在 FodyWeavers.xml 文件中添加配置 CreateTemporaryAssemblies‘true’ 官方文档&#xff1a;https://github.com/Fody/Costura <Weavers xmlns:xsi"http://www.w3.org/2001/XMLSchema-instance" xsi:noN…

DeepSeek R1满血+火山引擎详细教程

DeepSeek R1满血火山引擎详细教程 一、安装Cherry Studio。 Cherry Studio AI 是一款强大的多模型 AI 助手,支持 iOS、macOS 和 Windows 平台。可以快速切换多个先进的 LLM 模型,提升工作学习效率。下载地址 https://cherry-ai.com/ 认准官网&#xff0c;无强制注册。 这…

TP-LINK路由器如何设置网段、网关和DHCP服务

目标 ①将路由器的网段由192.168.1.XXX改为192.168.5.XXX ②确认DHCP是启用的&#xff0c;并将DHCP的IP池的范围设置为排除自己要手动指定的IP地址&#xff0c;避免IP冲突。 01-复位路由器 路由器按住复位键10秒以上进行重置操作 02-进入路由器管理界面 电脑连接到路由器&…

【C/C++】如何求出类对象的大小----类结构中的内存对齐

每日激励&#xff1a;“不设限和自我肯定的心态&#xff1a;I can do all things。 — Stephen Curry” 绪论​&#xff1a; 通过本章你能具体的了解到&#xff0c;如何计算出一个类的大小&#xff0c;并且了解其中到底是如何算的以及了解到为什么需要内存对齐这种算&#xff0…

鸿蒙开发第4篇__关于在鸿蒙应用中使用Java语言进行设计

本博文很重要 HarmonyOS从 API8 开始不再支持使用Java作为开发语言&#xff0c;未来的新功能将在ArkTS中实现. API 8对应的是HarmonyOS 3.0.0版本。请看下图&#xff1a; 因此&#xff0c; 读者如果看到类似《鸿蒙应用程序开发》(2021年版本 清华大学出版计)书 还使用Java语言…

【图文详解】论文《Attention Is All You Need》中位置嵌入(Positional Encoding)的流程和作用

文章目录 前言一、位置嵌入&#xff08;Positional Encoding&#xff09;的流程二、位置嵌入的作用三、为什么采用正弦和余弦函数四、位置嵌入示例五、结论 前言 亲爱的家人们&#xff0c;创作很不容易&#xff0c;若对您有帮助的话&#xff0c;请点赞收藏加关注哦&#xff0c…

SpringBoot 使用 spring.profiles.active 来区分不同环境配置

很多时候&#xff0c;我们项目在开发环境和生产环境的配置是不一样的&#xff0c;例如&#xff0c;数据库配置&#xff0c;在开发的时候&#xff0c;我们一般用测试数据库&#xff0c;而在生产环境&#xff0c;我们要用生产数据库&#xff0c;这时候&#xff0c;我们可以利用 p…

Android 常用命令和工具解析之存储相关

1 基本概念 2 命令解读 2.1 adb shell df df 命令主要用于需要检查文件系统上已使用和可用的磁盘空间的数量。如果没有指定文件名&#xff0c;则显示在当前所有挂载的文件系统上可用的空间。其原理是从proc/mounts 或 /etc/mtab 中检索磁盘信息。 注意&#xff1a;df命令并…

基于springboot+vue的融合多源高校画像数据与协同过滤算法的高考择校推荐系统

开发语言&#xff1a;Java框架&#xff1a;springbootJDK版本&#xff1a;JDK1.8服务器&#xff1a;tomcat7数据库&#xff1a;mysql 5.7&#xff08;一定要5.7版本&#xff09;数据库工具&#xff1a;Navicat11开发软件&#xff1a;eclipse/myeclipse/ideaMaven包&#xff1a;…

4个小时开发DeepSeek+baiduNaotu一键生成思维导图

一、引言 最近发现AI生成思维导图的解决方案普遍存在两个断层&#xff1a;用户需手动复制模型输出的JSON数据到脑图软件&#xff0c;且缺乏实时可视化反馈。基于日常使用的BaiduNaotu框架&#xff08;其轻量级架构与简洁的UI设计已满足基础需求&#xff09;&#xff0c;我决定…

【洛谷贪心算法题】P1094纪念品分组

该题运用贪心算法&#xff0c;核心思想是在每次分组时&#xff0c;尽可能让价格较小和较大的纪念品组合在一起&#xff0c;以达到最少分组的目的。 【算法思路】 输入处理&#xff1a;首先读取纪念品的数量n和价格上限w&#xff0c;然后依次读取每件纪念品的价格&#xff0c;…

【Azure 架构师学习笔记】- Terraform创建Azure 资源

本文属于【Azure 架构师学习笔记】系列。 前言 在实际的企业环境中&#xff0c;很少甚至可以说禁止手动创建资源&#xff0c;因为很容易出错&#xff0c;并且大规模部署时会非常低效。因此大部分企业都会使用工具或者某些服务来实现这种可控&#xff0c;可复用&#xff0c;具有…

JavaAPI(线程)

线程简介 进程&#xff08;Process&#xff09; 进程&#xff0c;是正在运行的程序实例&#xff0c;是操作系统进行资源分配的最小单位。 每个进程都有它自己的地址空间和系统资源&#xff08;比如CPU时间&#xff0c;内存空间&#xff0c;磁盘IO等&#xff09;。 多个进程…

冯诺依曼体系结构 ──── linux第8课

目录 冯诺依曼体系结构 关于冯诺依曼&#xff0c;必须强调几点&#xff1a; 冯诺依曼体系结构 我们常见的计算机&#xff0c;如笔记本。我们不常见的计算机&#xff0c;如服务器&#xff0c;大部分都遵守冯诺依曼体系 输入单元&#xff1a;包括键盘, 鼠标&#xff0c;网卡,扫…

7.1 线性代数进行图像处理

一、图像的奇异值分解介绍 A A A 的奇异值定理就是 A T A A^TA ATA 和 A A T AA^T AAT 的特征值定理。 这是本章的内容的预览。 A A A 有两个奇异向量的集合&#xff08; A T A A^TA ATA 和 A A T AA^T AAT 的特征向量&#xff09;&#xff0c;有一个是正奇异值的集合&#…

Java 大视界 -- Java 大数据在智慧环保污染源监测与预警中的应用(104)

&#x1f496;亲爱的朋友们&#xff0c;热烈欢迎来到 青云交的博客&#xff01;能与诸位在此相逢&#xff0c;我倍感荣幸。在这飞速更迭的时代&#xff0c;我们都渴望一方心灵净土&#xff0c;而 我的博客 正是这样温暖的所在。这里为你呈上趣味与实用兼具的知识&#xff0c;也…

「慢思考」机理分析:从雪球误差到正确推理概率

在大语言模型&#xff08;LLMs&#xff09;的发展历程中&#xff0c; Scaling Laws [1] 一直是推动性能提升的核心策略。研究表明&#xff0c;随着模型规模和训练数据的增长&#xff0c;LLMs 的表现会不断优化 [2]。然而&#xff0c;随着训练阶段规模的进一步扩大&#xff0c;性…