当前位置: 首页 > news >正文

算法(keep learning)

基础算法

背模板加刷题

排序

在这里插入图片描述

快排

主要思想:分治

  • 第一步:确认一个分界点,比如起点,中间点(分界点),末点
  • 第二步:调整区间,使得第一个区间的数都小于等于分界点,第二个区间都大于分界点
  • 递归处理左右两端
private static int[] quickSort(int[] arr, int left, int right) {// 递归终止条件,如果左边界大于等于右边界则认为递归结束if (left >= right) {return arr;}// 设定一个分界值,这里是(left + right)/ 2int p = arr[left + right >> 1];// 左右提前预留一个位置int i = left - 1;int j = right + 1;while (i < j) {// 等效于do while// 当数值小于分界值时持续遍历,直到找到第一个大于等于分界值的索引// 如果是逆序则调整两个while循环while (arr[++i] < p);while (arr[--j] > p);// 交换左右两侧不符合预期的数值if (i < j) {int temp = arr[i];arr[i] = arr[j];arr[j] = temp;}}// 由于分界值取的是left + right >> 1,因此递归取的是left,j j + 1,rightquickSort(arr, left, j);quickSort(arr, j + 1, right);return arr;
}

归并排序

归并排序本质上就是分治!
但是跟快排的分治方法不一样

  • 以整个数组的中间点划分
  • 递归排序两边
  • 将两个有序的数组合并
private static int[] mergeSort(int[] arr, int left, int right) {// 递归终止条件,如果左边界大于等于右边界则认为递归结束if (left >= right) {return arr;}// 设定一个分界值,这里是(left + right)/ 2int mid = left + right >> 1;	// 位运算// 切割arr = mergeSort(arr, left, mid);arr = mergeSort(arr, mid + 1, right);// 归并,长度刚好是 left 到 rightint[] temp = new int[right - left + 1];int i = left;int j = mid + 1;// 用来归并的索引int k = 0;while (i <= mid && j <= right) {// 如果是逆序则调整if条件if (arr[i] <= arr[j]) {temp[k++] = arr[i++];} else {temp[k++] = arr[j++];}}while (i <= mid) {temp[k++] = arr[i++];}while (j <= right) {temp[k++] = arr[j++];}// 根据归并后的数组重新赋值排序后的数组for (i = left, j = 0; i <= right; i++, j++) {arr[i] = temp[j];}return arr;
}

二分

两种模板,分别是 LBS,和 RBS

// 检查x是否满足某种性质  
private static boolean check(int x) {  /* ... */  
}  // 区间[left, right]被划分成[left, mid]和[mid + 1, right]时使用: 
// 或者称之为左二分查询,查找左侧第一个满足条件的数
private static int leftBinarySearch(int[] arr, int left, int right) {  while (left < right) {  int mid = arr[left + right >> 1];  if (check(mid)) {  right = mid;    // check()判断mid是否满足性质  } else {  left = mid + 1;  }  }  return left;  
}  // 区间[left, right]被划分成[left, mid - 1]和[mid, right]时使用:  
// 或者称之为右二分查询,查找右侧最后一个满足条件的数
private static int rightBinarySearch(int[] arr, int left, int right) {  while (left < right) {  int mid = arr[left + right + 1 >> 1];  if (check(mid)) {  left = mid;    // check()判断mid是否满足性质  } else {  right = mid - 1;  // 有加必有减}  }  return left;  
}
http://www.xdnf.cn/news/1465975.html

相关文章:

  • 外包干了3年,技术退步太明显了。。。。。
  • 计算机网络1 第一章 概述——以寄邮件比喻整个流程
  • threeJS 实现开花的效果
  • 概率论第三讲——多维随机变量及其分布
  • 要搞清楚你为什么上班
  • 大型语言模型SEO(LLM SEO)完全手册:驾驭搜索新范式
  • 深入剖析 ThreadLocal 及其生态系统:从基础用法到源码实现,从设计思想到工程实践
  • Android14 init启动Zygote详解
  • 必知!机器人的分类与应用:RPA、人形与工业机器人
  • 大数据毕业设计选题推荐-基于大数据的高级大豆农业数据分析与可视化系统-Hadoop-Spark-数据可视化-BigData
  • solidity函数篇
  • 5分钟征服Linux:20个神级命令+系统架构解密,让命令行恐惧症瞬间治愈!
  • 智能风险评估与欺诈检测系统
  • 普通键盘在MacOS上如何使用快捷键
  • 分布式常见面试题整理
  • k8s 部署 redis
  • springboot redis 缓存入门与实战
  • [bat-cli] 输出处理 | `OutputType` 和 `OutputHandle`
  • 基于华为云平台的STM32F103C8T6工业生产线温湿度监控系统
  • 深度学习书籍推荐
  • LangChain: Models, Prompts 模型和提示词
  • UE4 Mac构建编译报错 no member named “disjunction” in namespace “std”
  • 企业为何仍困在“数据孤岛”?——从iPaaS重构信息流的实践路径
  • 一个专为地图制图和数据可视化设计的在线配色网站,可以助你制作漂亮的地图!
  • Leetcode—2749. 得到整数零需要执行的最少操作数【中等】(__builtin_popcountl)
  • 嵌入式系统学习Day31(多路IO复用)
  • Android Studio新版本编译release版本apk实现
  • 在Ubuntu 20.04的服务器上查找的服务器的IP地址
  • 2025最全的软件测试面试八股文(含答案+文档)
  • 属性关键字