【基础算法】

article/2025/11/10 19:27:43

1.排序

-快速排序(先排序后递归)

一.找某一个数为基点(假设为x)

二.将这个数分为|--------<=x---------|-------->=x-------|

                                                     x

三.然后递归,x左,右两侧分别排序

四.后输出

核心代码:

void quick_sort(int q[], int l, int r)
{if (l >= r) return;int i = l - 1, j = r + 1, x = q[l + r >> 1];while (i < j){do i ++ ; while (q[i] < x);do j -- ; while (q[j] > x);if (i < j) swap(q[i], q[j]);}quick_sort(q, l, j), quick_sort(q, j + 1, r);
}

-归并排序

一.找一组数的中间值(数组里的)

二.将其分为左,右半边

|-------|-------|

left     mid    right

两边最小值比较

3.合并得结果

核心代码:

void merge_sort(int q[], int l, int r){if (l >= r)return;int mid = l + r >> 1;merge_sort(q, l, mid);merge_sort(q, mid + 1, r);int k = 0, i = l, j = mid + 1;while (i <= mid && j <= r)if (q[i] <= q[j]) tmp[k ++ ] = q[i ++ ];else tmp[k ++ ] = q[j ++ ];while (i <= mid) tmp[k ++ ] = q[i ++ ];while (j <= r) tmp[k ++ ] = q[j ++ ];for (i = l, j = 0; i <= r; i ++, j ++ )q[i] = tmp[j];}

2.二分查找

一.mid=r+l+1>>1;

    1 .true  [mid,r]   l=mid

     2 .false   [l,mid]  r=mid-1

二.mid=l+r>>1;

  1.true [l,mid]  r=mid

   2.false [mid+1,r]  l=mid+1

核心代码:

bool check(int x) {/* ... */} // 检查x是否满足某种性质// 区间[l, r]被划分成[l, mid]和[mid + 1, r]时使用:int bsearch_1(int l, int r){while (l < r){int mid = l + r >> 1;if (check(mid))r = mid;    // check()判断mid是否满足性质elsel = mid + 1;}return l;}// 区间[l, r]被划分成[l, mid - 1]和[mid, r]时使用:int bsearch_2(int l, int r){while (l < r){int mid = l + r + 1 >> 1;if (check(mid))l = mid;elser = mid - 1;}return l;

3.高精度

《1》加法

    A1  A2  A3

+         B1   B2

-----------------------

    C1    C2     C3

核心代码:

vector<int> add(vector<int> &A, vector<int> &B){if (A.size() < B.size())return add(B, A);vector<int> C;int t = 0;for (int i = 0; i < A.size(); i ++ ){t += A[i];if (i < B.size()) t += B[i];C.push_back(t % 10);t /= 10;}if (t)C.push_back(t);return C;}

2.减法

  A1  A2  A3

 —    B1   B2

-----------------------

    C1    C2     C3

核心代码:

// C = A - B, 满足A >= B, A >= 0, B >= 0vector<int> sub(vector<int> &A, vector<int> &B){vector<int> C;for (int i = 0, t = 0; i < A.size(); i ++ ){t = A[i] - t;if (i < B.size())t -= B[i];C.push_back((t + 10) % 10);if (t < 0)t = 1;else t = 0;}while (C.size() > 1 && C.back() == 0)C.pop_back();return C;}

3.高精度乘法

A1    A2      A3

x       B1       B2

---------------------

 C1    C2     C3

核心代码:

vector<int> mul(vector<int> &A, int b){vector<int> C;int t = 0;for (int i = 0; i < A.size() || t; i ++ ){if (i < A.size())t += A[i] * b;C.push_back(t % 10);t /= 10;}while (C.size() > 1 && C.back() == 0)C.pop_back();return C;}

4.除法

// A / b = C ... r, A >= 0, b > 0vector<int> div(vector<int> &A, int b, int &r){vector<int> C;r = 0;for (int i = A.size() - 1; i >= 0; i -- ){r = r * 10 + A[i];C.push_back(r / b);r %= b;}reverse(C.begin(), C.end());while (C.size() > 1 && C.back() == 0)C.pop_back();return C;}

4.前缀与差分

一.一维前缀和

  核心代码:

for(int i=1;i<=n;i++)s[i]=s[i-1]+a[i];

二.二维前缀和

核心代码:

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];

三.差分(前缀和的逆运算)

构造使得a成为b的前缀和,b则称为a 的差分。

一.一维差分

核心代码:

void insert(int l,int r,int c){b[l]+=c;b[r+1]-=c;//[l,r]区间内加c,r+1不需要+c,所以减去c}

二.二维差分

核心代码:

void insert (int x1,int y1,int x2 int y2,int c){b[x1][y1]+=c;b[x2+1][y1]-=c;b[x1][y2+1]-=c;b[x2+1][y2+1]+=c;}

5.双指针算法

核心代码:

for (int i = 0, j = 0; i < n; i ++ ){while (j < i && check(i, j))j ++ ;}

6.位运算

 参考百度图片

7.离散化

例如 a[i]   1    3   100    2000

离散化后   0     1    2       3----->这个过程叫离散化

核心代码:

vector<int> alls; // 存储所有待离散化的值sort(alls.begin(), alls.end()); // 将所有值排序alls.erase(unique(alls.begin(), alls.end()), alls.end());   // 去掉重复元素// 二分求出x对应的离散化的值int find(int x) // 找到第一个大于等于x的位置{int l = 0, r = alls.size() - 1;while (l < r){int mid = l + r >> 1;if (alls[mid] >= x) r = mid;else l = mid + 1;}return r + 1; // 映射到1, 2, ...n}

8.区间合并

例如:

|——|     |———|      |——|      |——|       |——|

1       2    2   3    4     5      6     7       8     8       9

  |————|      |——|     |——|

  1            4       5      6    7      9

核心代码:

// 将所有存在交集的区间合并void merge(vector<PII> &segs){vector<PII> res;sort(segs.begin(), segs.end());int st = -2e9, ed = -2e9;for (auto seg : segs)if (ed < seg.first){if (st != -2e9) res.push_back({st, ed});st = seg.first, ed = seg.second;}else ed = max(ed, seg.second);if (st != -2e9) res.push_back({st, ed});segs = res;


http://chatgpt.dhexx.cn/article/MfLR2HDl.shtml

相关文章

算法 基础

什么是算法&#xff1f; 算法&#xff08;Algorithm&#xff09; 是指解题方案的准确而完整的描述&#xff0c; 是一系列解决问题的清晰指令&#xff0c; 算法代表着用系统的方法描述解决问题的策略机制。 一个算法的优劣可以用空间复杂度与时间复杂度来衡量。 大 O 表示法 定…

《算法基础》简单算法

《acwing算法基础》简单算法 文章目录 《acwing算法基础》简单算法快速排序:思路:时间复杂度:代码:快排边界问题:练习题: 归并排序:思路:时间复杂度:代码:练习题: 二分思想:思路:时间复杂度:代码:练习题: 一维前缀合与二维前缀和:差分:双指针算法:模板:练习题: 二进制算法:离散…

算法(基础)

算法基础 学习网址排序线性表顺序表链表栈与队列栈队列贪心法分治法搜索法滤波哈夫曼编码与译码B站视频csdn博客算法是编程的灵魂 学习网址 https://www.runoob.com/排序 冒泡排序分析

算法基础课-基础算法

基础算法 第一章 基础算法1快速排序2归并排序3二分算法整数二分浮点二分 4高精度高精度加法高精度减法高精度乘法&#xff08;一个高精度乘正常整数&#xff09;高精度除法&#xff08;一个高精度除以正常整数&#xff09; 5前缀和一维前缀和二维前缀和 6差分一维差分二维差分 …

【算法基础】基础算法

快速排序 模板题&#xff1a;785. 快速排序 - AcWing题库 思路&#xff1a; 定义一个x&#xff08;一般喜欢用中间的&#xff09;&#xff0c;我们快速排序&#xff0c;让x左边的都比它小&#xff0c;同时让右边的都比它大。然后像二分一样不断细分&#xff0c;缩小范围进行同…

数据结构与算法基础

来源&#xff1a; bilibili数据结构与算法基础&#xff08;青岛大学-王卓&#xff09; 1.2 基本概念和术语 数据结构 数据元素之间的关系称为结构&#xff0c;数据结构是相互之间存在一种或多种特定关系的数据元素的集合。 数据结构的两个层次&#xff1a;逻辑结构和物理结构…

数据结构与算法基础(一)

大家好 我是makasa 这个栏目呢&#xff0c;我会按照我之前通过视频学习的一个笔记来记录. 同时,通过写这几篇blog来巩固一下我的基础 数据结构与算法&#xff0c;顾名思义&#xff0c;分为两个部分&#xff1a;数据结构、算法。那它们各自具体概述是什么呢。让我们看以下两个图…

【算法】算法基础

文章目录 1. 字符串1.1LeetCode151 Reverse Words in a String1.2LeetCode557 Reverse Words in a String III1.3统计字符串字母&#xff0c;数字&#xff0c;空格和其他字符个数1.4把字符串转换成整数1.5回文字符串 2.整数2.1LeetCode7 Reverse Integer2.2判断一个数是不是质数…

算法基础---基础算法

文章目录 快速排序归并排序二分 整数二分浮点数二分高精度 高精度加法高精度减法高精度乘法高精度除法前缀和 一维前缀和二维前缀和差分 一维差分二维差分双指针位运算离散化区间合并 一、快速排序 思想&#xff1a;1.首先确定一个分界点&#xff08;随机取任意一点为…

算法基础知识总结(基础算法)

算法基础知识总结 Efficient procedures for solving problems on large inputs. 一、基础算法 1、快速排序 1、类别&#xff1a;快速排序是一种 交换排序&#xff0c;冒泡排序也是一种交换排序。 2、原理&#xff1a;将未排序的元素根据一个作为基准的主元&#xff08;Pi…

算法基础知识

一、算法的定义 算法&#xff1a;对特定问题求解步骤的一种描述&#xff0c;是为解决一个或一类问题给出的一个确定的、有限长的操作序列。 二、算法与程序的区别与联系 区别&#xff1a; 程序&#xff1a;与某种编程语言有关&#xff0c;能直接在机器上运行。 算法&#xff1a…

算法基础简介

一、什么是算法 在数学领域&#xff0c;算法是为了解决某一类问题的公式和思想。 在计算机领域&#xff0c;本质是一些计算机指令&#xff0c;解决特定运算和逻辑问题。 算法的掌握程度&#xff0c;一方面可以检验程序员对计算机底层的了解&#xff0c;一方面也…

Unity 移动的几种方法(从某一点移动到另外一点)

对于unity的几种移动方法,在以下给出整理 1 方向*速度 2 vector.lerp 与目标点永远不会重合 3 vector.MoveTowards 会与目标点重合 4 translate方法 纯移动 5 WASD键盘方法 刚 体方法 7.鼠标方法 捕鱼达人 8.射线方法(指哪到哪) Controll…

Unity 控制物体移动

目录 1、通过改变物体的位置使物体移动 2、通过给物体施加力使物体移动 3、移动characterController以及碰撞检测 一、相关代码展示 1、通过改变物体的位置使物体移动 using System.Collections; using System.Collections.Generic; using UnityEngine;public class move …

unity3D人物移动的实现(一)

人物的移动&#xff0c;首先要考虑人物与地面的碰撞&#xff0c;碰撞发生的条件是&#xff0c;两者必须都为碰撞体&#xff0c;且至少有一方为刚体&#xff0c;为了方便&#xff0c;我们就给人物加上刚体属性和碰撞体。 1首先是碰撞体属性&#xff0c;人形使用胶囊碰撞体&#…

Unity让物体跟随鼠标移动

前言 最近在学习Unity&#xff0c;记录下学习的成果吧。本文最终结果是要实现一个小飞机跟随鼠标移动的效果。看下图片。 向量 在Unity中&#xff0c;每个对象都有自己的位置属性&#xff0c;组件叫做Transform,通过Transform可以获取对象的位置属性。在上面的实例中&#…

01_Unity常用的移动方法

文章目录 基础框架匀速移动变速移动自定义变速运动总结&#xff1a; 在制作一款游戏的时候&#xff0c;经常需要对物体的位置进行移动&#xff0c;我们希望这个移动是具有多样性的&#xff0c;并且可操作的。 C#中提供了非常丰富的移动代码工具&#xff0c;通过这些工具我们可以…

Unity点击物体后,移动到物体所在位置

Unity点击物体后&#xff0c;移动到物体所在位置 方法一&#xff1a;OnMouse检测&#xff08;需要Collider组件&#xff09; 脚本挂在被点击的物体上 using System.Collections.Generic; using UnityEngine; using UnityEngine.SceneManagement;/// <summary> /// 缺点…

Unity2D教程:人物移动

关注专栏&#xff0c;持续更新哦 教程总目录 按键 自带的Input有GetAxisRaw来获取按下按键后所对应的值&#xff0c;Input.GetAxisRaw(“Horizontal”)在按下D或右箭头返回1&#xff0c;A或左箭头返回-1&#xff1b;Input.GetAxisRaw(“Vertical”)同理。 Input.GetAxis会根…

Unity物体跟随鼠标移动

刚开始在将鼠标点转换为世界坐标时&#xff0c;我以为可以直接使用Unity的Camera.main.ScreenToWorldPoint( Input.mousePosition ) 就完事了&#xff0c;事实证明我想的太简单了。在我们使用这个API将鼠标屏幕点&#xff08;Screen&#xff09;转换成世界坐标&#xff08;Worl…