算法(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;
}

二分

有单调性一定可以二分,但是二分不一定有单调性

整数二分
// 检查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;  
}
浮点二分
// 检查x是否满足某种性质  
private static boolean check(double x) {  /* ... */  
}  // eps 表示精度,取决于题目对精度的要求,默认负六次方
private static double EPS = 1e-6;private static double floatBinarySearch(double left, double right) {  while (right - left > EPS) {  double mid = (left + right) / 2;  if (check(mid)) {  right = mid;  } else {  left = mid;  }  }  return left;  
}

一维前缀和

S[i] = a[1] + a[2] + … a[i]
a[l] + … + a[r] = S[r] - S[l - 1]

private static final int N = 100010;
private static final int[] a = new int[N + 5];
private static final int[] s = new int[N + 5];private static void init(int n) {  for (int i = 1; i <= n; i++) {  s[i] = s[i - 1] + a[i];  }  
}  private static int sumPrefix(int left, int right) {  return s[right] - s[left - 1];  
}

二维前缀和

S[i, j] = 第 i 行 j 列格子左上部分所有元素的和
以(x1, y1)为左上角,(x2, y2)为右下角的子矩阵的和为:
S[x2, y2] - S[x1-1, y2] - S[x2, y1-1] + S[x1-1, y1-1]

private static final int N = 1010;  
private static final int[][] a = new int[N + 5][N + 5];  
private static final int[][] s = new int[N + 5][N + 5];private static void init(int n, int m) {  for (int i = 1; i <= n; i++) {  for (int j = 1; j <= m; j++) {  s[i][j] = s[i - 1][j] + s[i][j - 1] - s[i - 1][j - 1] + a[i][j];  }  }  
}  private static int sumPrefix(int x1, int y1, int x2, int y2) {  return s[x2][y2] - s[x2][y1 - 1] - s[x1 - 1][y2] + s[x1 - 1][y1 - 1];  
}

一维差分

给区间[l, r]中的每个数加上 c:B[l] += c, B[r + 1] -= c
在这里插入图片描述

private static final int N = 100010;  
private static final int[] a = new int[N + 5];  
private static final int[] b = new int[N + 5];private static void init(int n) {  for (int i = 1; i <= n; i++) {  b[i] = a[i] - a[i - 1];  }  
}  private static void difference(int left, int right, int c) {  b[left] += c;  b[right + 1] -= c;  
}

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

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

相关文章

Django项目架构

背景&#xff1a;很多人写 Django 时容易“什么都往 views 里塞”&#xff0c;结果项目一大就乱套了。需要把 视图层 / 业务层 / 数据层 等职责清晰分出来。图解说明Client&#xff1a;浏览器 / App / 前端调用 API。urls.py&#xff1a;定义 API 路由&#xff0c;把请求分发到…

MySQL】从零开始了解数据库开发 --- 表的操作

永远记住&#xff0c;你的存在是有意义的&#xff0c; 你很重要&#xff0c; 你是被爱着的&#xff0c; 而且你为这个世界带来了无可取代的东西。 -- 麦克西 《男孩、鼹鼠、狐狸和马》-- 从零开始了解数据库开发创建数据表查看表结构修改数据表结构重命名表复制表删除表今天我们…

MySQL底层架构设计原理详细介绍

文章目录一、MySQL体系结构概览二、连接层&#xff08;Connection Layer&#xff09;1. 连接器&#xff08;Connectors&#xff09;2. 连接池&#xff08;Conncction Pool&#xff09;三、服务层&#xff08;Server Layer&#xff09;1. SQL接口组件&#xff08;SQL Interface&…

QB/T 4674-2021 汽车内装饰用聚氨酯束状超细纤维合成革检测

汽车内饰品聚氨酯束状超细纤维合成革是指以海岛型双组份或多组分纤维加工成飞织造布&#xff0c;再经水性聚氨酯树脂或溶剂型聚氨酯树脂浸渍、湿法凝固、溶剂或碱液萃取及后整理等工艺制成的汽车内装饰皮革。QB/T 4674-2021 汽车内装饰用聚氨酯束状超细纤维合成革检测项目测试项…

QML和Qt Quick

QML和Qt Quick QML 和 Qt Quick 是 Qt 框架中紧密相关但概念不同的两个部分&#xff0c;它们之间的关系可以用如下方式清晰说明&#xff1a; 核心区别概览​​特性​​​​QML​​​​Qt Quick​​​​本质​​声明式编程​​语言​​基于 QML 的​​框架/库​​​​作用​​定…

JavaScript 结构型设计模式详解

1. 代理模式1.1. 使用场景代理模式在不改变原始对象的前提下&#xff0c;通过代理对象控制对其访问&#xff0c;通常用于权限控制、延迟加载、远程调用等场景。在前端开发中&#xff0c;可以通过代理模式对网络请求、缓存机制等进行控制。1.2. 代码实现class ApiService {reque…

摄像头模块在运动相机中的特殊应用

运动相机作为记录高速运动场景的专用设备&#xff0c;其摄像头模块的设计与普通消费电子产品存在显著差异。根据行业资料和技术发展&#xff0c;摄像头模块在运动相机中的特殊应用主要体现在以下五个维度&#xff1a;一、极端环境适应性设计运动相机的摄像头模块针对户外运动场…

SpringBoot + MinIO/S3 文件服务实现:FileService 接口与 FileServiceImpl 详解

在企业项目中&#xff0c;文件上传和管理是非常常见的需求。本文基于 芋道源码 的实现&#xff0c;介绍如何封装一个通用的 文件服务 FileService&#xff0c;支持&#xff1a;文件上传&#xff08;保存数据库记录 存储文件到 S3/MinIO 等对象存储&#xff09;文件下载与删除文…

Oracle RAC认证矩阵:规避风险的关键指南

RAC Certification Matrix&#xff08;RAC认证矩阵&#xff09; 是Oracle官方发布的硬件、软件与操作系统兼容性清单&#xff0c;明确规定了哪些平台、组件和版本可以正式支持Oracle RAC&#xff08;Real Application Clusters&#xff09;的部署。它是搭建或升级RAC环境时必须…

【自然语言处理与大模型】如何通过微调来agent性能?

虽然大模型本身具备一定的指令理解和工具调用潜力&#xff0c;但在实际应用中&#xff0c;尤其是在复杂或专业领域&#xff0c;往往需要通过微调来提升Agent的工具调用能力。问题一&#xff1a;基座模型无法准确识别或选择特定领域的工具当Agent需要在医疗、金融、法律、工业控…

在 Keil 中将 STM32 工程下载到 RAM 进行调试运行

在 Keil 中将 STM32 工程下载到 RAM 进行调试运行 在使用 STM32 进行调试时&#xff0c;默认情况下代码会被烧写到 Flash 中运行。然而&#xff0c;Flash 写入速度较慢&#xff0c;擦写次数有限&#xff0c;且调试过程中频繁烧写可能影响开发效率。在某些场景下&#xff08;如快…

【51单片机】【protues仿真】基于51单片机宠物投食系统

目录 一、主要功能 二、使用步骤 三、硬件资源 四、软件设计 五、实验现象 一、主要功能 1、LCD1602液晶显示时间、温度、食物重量 2、按键手动投喂食物​ 3、称重模块检测当前食物重量 4、食物重量小于阈值会声光警报并自动投喂 二、使用步骤 基于51单片机的宠物投食…

腾讯云负载均衡增加访问策略后访问失败

为了测试&#xff0c;在负载均衡的安全组添加2条安全策略&#xff0c;限制办公室内IP可访问&#xff0c;其他IP地址拒绝所有访问。结果&#xff0c;访问失败。经过反复测试&#xff0c;主要是js问价加载失败&#xff0c;动态接口访问代码返回正常。再进行测试&#xff0c;发现去…

CSS的文本样式

1.文本样式的分类注意&#xff1a;必须先建立标签&#xff0c;再在head中修改1.1字体样式1.1.1字体颜色代码演示<head><meta charset"UTF-8"><meta name"viewport" content"widthdevice-width, initial-scale1.0"><title&g…

R语言读取excel文件数据-解决na问题

文章目录安装R语言运行环境实现代码遇到的问题总结安装R语言运行环境 安装教程连接, 包含国内镜像快速下载 实现代码 实现思路&#xff1a;使用python将文件的空字符的位置变成0&#xff0c;生成csv文件后交给R语言处理python实现代码如下&#xff1a; import pandas as pd…

【Nginx 运维实战】版本替换:强制 vs 平滑升级全解析

【Nginx 运维实战】版本替换&#xff1a;强制 vs 平滑升级全解析一&#xff1a;版本替换的两种思路二&#xff1a;使用场景对比三&#xff1a;实战1&#xff09;强制替换1.备份旧版本2.替换为新版本3.**赋予执行权限**4.**重启 Nginx**2&#xff09;平滑替换1.确认进程文件2.备…

MQ-消息队列

定义 Mssage Queue&#xff1a;消息队列。它是一种“先进先出”&#xff08;FIFO&#xff09;的数据结构&#xff0c;用于在分布式系统或应用程序之间进行异步通信。组成1. 生产者&#xff08;Producer&#xff09;定义&#xff1a;消息的发送方&#xff0c;负责将业务系…

NVIDIA驱动程序核心的“即时编译器”(Just-in-Time, JIT Compiler)详细介绍

我们来详细、深入地剖析这个位于NVIDIA驱动程序核心的“即时编译器”&#xff08;Just-in-Time, JIT Compiler&#xff09;。它堪称CUDA生态系统成功的“幕后英雄”&#xff0c;是连接软件稳定性和硬件飞速发展的关键桥梁。 第一部分&#xff1a;JIT编译器的本质 首先&#xff…

【PS2025全网最新版】稳定版PS2025保姆级下载安装详细图文教程(附安装包)(Adobe Photoshop)

今天&#xff0c;给大家带来PS2025的保姆级下载安装图文教程。 前言&#xff1a; Adobe Photoshop 作为业界领先的图像处理与设计软件&#xff0c;持续推动着数字创意领域的发展。其应用涵盖平面设计、摄影后期、UI/UX 设计、影视特效等多个专业方向&#xff0c;为用户提供强…

分享TWS充电仓方案开发设计

TWS耳机市场“卷”到最后&#xff0c;拼的早已不只是音质&#xff0c;而是续航、交互、体积、成本四位一体。传统充电仓用多颗IC堆砌&#xff1a;升压、电量计、霍尔、LED驱动、保护IC……BOM高、贴片复杂、调试周期长。8位MCU把上述功能“一锅端”&#xff1a;单芯片即完成电源…