
算法基础
文章平均质量分 75
程序设计与算法
向晚大魔王Avvvvvva
华南农业大学软件工程学生
展开
-
5.13一行代码就能解决的算法题
你和你的朋友,两个人一起玩 Nim 游戏:桌子上有一堆石头。你们轮流进行自己的回合, 你作为先手。每一回合,轮到的人拿掉 1 - 3 块石头。拿掉最后一块石头的人就是获胜者。假设你们每一步都是最优解。请编写一个函数,来判断你是否可以在给定石头数量为 n 的情况下赢得游戏。如果可以赢,返回 true;否则,返回 false。来源:力扣(LeetCode)链接:https://leetcode.cn/problems/nim-game著作权归领扣网络所有。原创 2022-09-03 11:05:39 · 901 阅读 · 0 评论 -
5.11-5.12Union-Find算法详解
并查集算法主要是用来解决图论中**“动态连通性”**问题的。简单来说动态连通性其实可以抽象成一幅图连线,比如说有一幅图,总共有10个节点,它们互不连通,分别用0-9进行标记[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-FcJ1dL6K-1662174261439)(./image/UF-01.png)]Union-Find算法需要实现以下这两个API。原创 2022-09-03 11:04:41 · 492 阅读 · 0 评论 -
5.10如何调度考生的座位
在考场里,一排有 N 个座位,分别编号为 0, 1, 2, …, N-1。当学生进入考场后,他必须坐在能够使他与离他最近的人之间的距离达到最大化的座位上。如果有多个这样的座位,他会坐在编号最小的座位上。(另外,如果考场里没有人,那么学生就坐在 0 号座位上。)返回 ExamRoom(int N) 类,它有两个公开的函数:其中,函数 ExamRoom.seat() 会返回一个 int (整型数据),代表学生坐的位置;原创 2022-09-03 11:04:11 · 1151 阅读 · 0 评论 -
5.9如何判断括号的合法性
对括号的合法性判断是一个常见而且实用的问题,而且我们的代码可能会包括三种括号[]{}(),判断起来会具有一些难度给你输入一个字符串,其中包含[](){}六种括号,请判断这个字符串组成的括号是否合法对于这种全局难的问题,可以采用一种局部分析到全局的办法进行分析。...原创 2022-09-01 15:00:09 · 621 阅读 · 0 评论 -
5.7-5.8贪心算法应用实例
贪心算法可以认为是动态规划中算法的一个特例,相比于动态规划,使用贪心算法需要满足更多的条件(贪心选择性质),但是效率比动态规划要高比如一个算法问题使用暴力解法需要指数级别的时间,如果能使用动态规划消除重叠子问题,就可以降到多项式级别的时间复杂度,如果满足贪心选择性质,那么可以进一步降低时间复杂度到达线性级别贪心选择性质:每一步都做出一个局部最优的旋转,最终的结果就是全局最优,一个比较浅显的例子就是,现在给你100张人民币,要求获得最多钱,那么我只要在接下来的每次选择中都选择面额最大的那张纸币就可以了。...原创 2022-08-30 22:55:24 · 416 阅读 · 0 评论 -
5.6如何寻找最长回文子串
给你一个字符串s,找到s中最长的回文子串。双指针样例分析:输入s=acaba,那么算法应该要返回aca或者aba当拿到题目没有思路的时候,不妨先从局部入手,从局部逐步推导达到最优解s'ss'存在于raw字符串raw'aacxycaaaacyxcaaaaccaa。...原创 2022-08-30 22:54:15 · 339 阅读 · 0 评论 -
数据库原理(1)综述
数据定义语言(Data-Definition Language,DDL):数据库模式(架构)是通过一系列定义来说明,这些定义由一种称作为DDL的特殊语言来表达。DDL也可以用来定义数据的其他特征数据库系统所使用的存储结构和访问方式通过一系列特殊得到DDL语句来说明的,这种特殊的DDL称作**数据存储和定义(data storage and definition)**语言存储在数据中的数据值必须满足某些一致性约束(consistenhcy constraint)...原创 2022-08-30 22:53:31 · 494 阅读 · 0 评论 -
5.5如何去除有序数组的重复元素
给你一个 升序排列 的数组 nums ,请你原地删除重复出现的元素,使每个元素 只出现一次 ,返回删除后数组的新长度。元素的 相对顺序 应该保持 一致。由于在某些语言中不能改变数组的长度,所以必须将结果放在数组nums的第一部分。更规范地说,如果在删除重复项之后有 k 个元素,那么 nums 的前 k 个元素应该保存最终结果。将最终结果插入 nums 的前 k 个位置后返回 k。不要使用额外的空间,你必须在 原地 修改输入数组 并在使用 O(1) 额外空间的条件下完成。...原创 2022-08-30 19:46:23 · 392 阅读 · 0 评论 -
5.3-5.4二分搜索算法实例
搜索空间是有序的珂珂喜欢吃香蕉。这里有 n 堆香蕉,第 i 堆中有 piles[i] 根香蕉。警卫已经离开了,将在 h 小时后回来。珂珂可以决定她吃香蕉的速度 k (单位:根/小时)。每个小时,她将会选择一堆香蕉,从中吃掉 k 根。如果这堆香蕉少于 k 根,她将吃掉这堆的所有香蕉,然后这一小时内不会再吃更多的香蕉。珂珂喜欢慢慢吃,但仍然想在警卫回来前吃掉所有的香蕉。返回她可以在 h 小时内吃掉所有香蕉的最小速度 k(k 为整数)。来源:力扣(LeetCode)...原创 2022-08-29 22:07:58 · 331 阅读 · 0 评论 -
5.1-5.2高效解决常见数论问题
输入一个正整数n,函数返回区间[2,n)中素数的个数这种解法下,i不需要遍历到你n,只需要到sqrt(n)即可。假设n=12时sqrt(n)n。原创 2022-08-29 22:07:22 · 231 阅读 · 0 评论 -
4.10扁平化嵌套序列
给你一个嵌套的整数列表 nestedList。每个元素要么是一个整数,要么是一个列表;该列表的元素也可能是整数或者是其他列表。请你实现一个迭代器将其扁平化,使之能够遍历这个列表中的所有整数。实现扁平迭代器类 NestedIterator :NestedIterator(List nestedList) 用嵌套列表 nestedList 初始化迭代器。int next() 返回嵌套列表的下一个整数。boolean hasNext() 如果仍然存在待迭代的整数,返回 true;...原创 2022-08-28 12:07:59 · 335 阅读 · 0 评论 -
4.9前缀和解决子数组问题
思路:对于一个给定的数组nums,额外开辟一个前缀和数组进行预处理//前缀和数组:定义前n项的和,也就是下标从[0...i-1]的和 int [ ] preSum = new int [ n + 1 ];//n+1:因为需要记录前n项的和,因此需要多一位 preSum [ 0 ] = 0;//前0项的和当然为0 for(int i = 1;i ...原创 2022-08-28 12:07:33 · 217 阅读 · 0 评论 -
4.8烧饼排序问题
给你一个整数数组 arr ,请使用 煎饼翻转 完成对数组的排序。一次煎饼翻转的执行过程如下:选择一个整数 k ,1原创 2022-08-28 12:06:10 · 472 阅读 · 0 评论 -
4.7拆解复杂问题-实现计算器
- * /原创 2022-08-28 12:05:41 · 279 阅读 · 0 评论 -
回溯算法4.1-4.4
1,2][1,2,3][1,2,3][1,2][1,2,3][1,2][1,2][1]来分析一下这个问题的时间复杂度,计算递归算法的时间复杂度方法是,找到,对于这个问题而言,递归的问题是N,但是我们发现每次递归for循环的迭代次数取决于res的长度,这并不是固定的依照刚才的思路,res的长度应该是每次递归都会翻倍,所以说总的迭代次数应该是2N个,所以说res添加元素只有会有2^N,同时我们copy的时候,是把ans[i]复制一份添加到数组的最后,所以一次操作的时间是O(N),还是比较耗时的。...原创 2022-08-26 15:51:28 · 209 阅读 · 0 评论 -
3.7-3.11特殊数据结构
可以使得每次新元素入栈后,栈内的元素都保持单调(单调递增或者单调递减)单调栈一般用来决绝nums1 中数字 x 的 下一个更大元素 是指 x 在 nums2 中对应位置右侧的第一个比 x大的元素。给你两个 没有重复元素 的数组 nums1 和 nums2 ,下标从 0 开始计数,其中nums1 是 nums2 的子集。...原创 2022-08-26 15:50:51 · 251 阅读 · 0 评论 -
3.1-3.2LFU&LRU算法
LFU算法:每次淘汰那些使用次数最少的数据,LRU算法相当于把数据按照时间进行排序,这个需求借助链表很自然就能够实现,一直从链表头部加入元素的话,就可以实现这个需求,其越接近头部的话就是越新的数据,越接近尾部的元素就越是旧的数据,进行缓存淘汰的时候只需要简单将尾部的元素淘汰即可。LFU算法相当于把数据按照访问频次进行排序,如果多个数据拥有相同的访问频次就应该删除最早插入的那个数据,也就是说LFU算法是淘汰访问频次最低的数据,如果访问频次最低的数据有多条,需要淘汰最旧的数据。原创 2022-08-23 12:02:19 · 733 阅读 · 0 评论 -
3.3-3.6二叉树专题
遍历BST,找到合适的位置:从root节点开始,按照左小右大的规则找位置,我们为了简化问题,就不做那种从已有节点中强行插入的操作了,我们要的最终效果是找到一个空的位置,按照规则将节点连接上就好了。或许可能会问,诶这个右子树中的任意一个节点不是也比左子树的所有节点都要大吗,那我在右边瞎选一个就不行吗,注意,这里要求的是两个同时成立,万一你选出来的这个节点比右子树的一个节点要大咋办?给定一个二叉搜索树的根节点 root 和一个值 key,删除二叉搜索树中的 key 对应的节点,并保证二叉搜索树的性质不变。原创 2022-08-23 11:27:44 · 444 阅读 · 0 评论 -
算法套路学习笔记(第二章) 动态规划系列 2.4-2.8
关键是要学习 以及和 以及dp数组的,这就是最优子结构问题,如果要满足最优子结构问题,那么就必须要满足子问题之间相互独立的条件。如果有存在不满足最优子结构问题的,那么可以对该问题进行转换,可以通过一定的数学推理变换将不具有最优子结构的问题转换为具有最优子结构的问题。例如说:要求全校所有人的最大分数差,不能通过求取每班的最大分数差来求得,这种就不是直观的最优子结构问题,但是我们可以通过转换为其他具有最优子结构的而且该问题求解得出的参量与数据是有一定关系的。比如说我要求全校所有人的最大分数差,虽然没办法用原创 2022-07-10 15:03:40 · 152 阅读 · 0 评论 -
算法套路学习笔记(第一章)
前言现在是2021-11-21,开始使用东哥的算法小抄进行算法的学习,这篇文章就算是我的读书笔记吧,侵权删。1.1 基础语法使用备份1.哈希表 unordered_map常用方法:①size_type count(const key_type& key);返回哈希表中key出现的次数,因为哈希表不会出现重复的键,所以该函数只可能返回0或者1可以用来判断键key是否存在于哈希表中②size_type erase(const key_type& key)通过key来清除哈希表中原创 2021-11-23 21:36:52 · 830 阅读 · 1 评论 -
2021SCAU数据结构复习 实验六 (各种排序算法)-实验7
题1:8638 直接插入排序题目描述Description用函数实现直接插入排序,并输出每趟排序的结果.输入格式第一行:键盘输入待排序关键的个数n第二行:输入n个待排序关键字,用空格分隔数据输出格式每行输出一趟排序结果,数据之间用一个空格分隔输入样例105 4 8 0 9 3 2 6 7 1输出样例4 5 8 0 9 3 2 6 7 14 5 8 0 9 3 2 6 7 10 4 5 8 9 3 2 6 7 10 4 5 8 9 3 2 6 7 10 3 4 5 8 9 2原创 2021-06-14 21:23:55 · 2147 阅读 · 2 评论 -
18730 涂色问题(快速幂)
题目描述Description在某大学的农场里,n间牛舍住着n头奶牛。现在你需要为n间牛舍的外墙涂色,有m种可选颜色。我们已经知道当相邻两间牛舍颜色相同时,奶牛们会集体发疯。请问有多少种涂色方案会让奶牛们发疯,由于答案可能较大,输出对1000000007求余的结果。输入格式仅一行,两个整数n和m,代表牛舍数量和颜色数量。(1<=n<=1e12),(1<=m<=1e12)输出格式仅一样,一个整数代表答案。输入样例3 2输出样例6提示3牛舍2颜色方案有(1,1原创 2021-05-30 20:11:25 · 434 阅读 · 0 评论 -
最短路径问题
普里姆算法题目描述Description给定结点数为n,边数为m的带权无向连通图G,所有结点编号为1,2,3…n。求图G的最小生成树的边权和。输入格式第一行两个正整数n和m。n,m<=2000之后的m行,每行三个正整数a,b,w,描述一条连接结点a和b,边权为w的边。1=<a,b<=n,w<=10^18。注意可能存在重边和自环。输出格式一个整数表示图G的最小生成树的边权和(注意用长整型)。输入样例7 121 2 91 5 21 6 32 3 52 6原创 2021-05-28 16:46:36 · 656 阅读 · 0 评论 -
单调栈三题
题1:19016 柱状图中最大的矩形题目描述Description给定 n 个非负整数,用来表示柱状图中各个柱子的高度。每个柱子彼此相邻,且宽度为 1 。求在该柱状图中,能够勾勒出来的矩形的最大面积。输入格式第一行一个整数n代表柱子个数。1<=n<=1e5 第二行n个正整数,代表柱子的高度。输出格式输出最大面积。(注意此类题目的答案可能超出int范围)输入样例62 1 5 6 2 3输出样例10作者 30002692AC代码#include <iostrea原创 2021-05-26 23:48:45 · 178 阅读 · 0 评论 -
2021SCAU数据结构复习 实验四(二叉树专题)
题1:8606 二叉树的构建及遍历操作题目描述Description 构造二叉链表表示的二叉树:按先序次序输入二叉树中结点的值(一个字符),’#'字符表示空树,构造二叉链表表示的二叉树T;再输出三种遍历序列。本题只给出部分代码,请补全内容。#include “stdio.h”#include “malloc.h”#define TRUE 1#define FALSE 0#define OK 1#define ERROR 0#define INFEASIBLE -1#define OV原创 2021-05-26 19:51:07 · 2108 阅读 · 1 评论 -
2021计算智能期末复习
题1:18005 It is not ugly number题目描述18005 It is not ugly number时间限制:2000MS 代码长度限制:10KB提交次数:0 通过次数:0题型: 编程题 语言: G++;GCCDescriptionUgly numbers are numbers whose only prime factors are 2, 3 or 5. The sequence1, 2, 3, 4, 5, 6, 8, 9, 10, 12, …shows t原创 2021-05-16 23:50:42 · 2463 阅读 · 3 评论 -
动态规划入门
最长公共子序列问题题目描述Description给定两个字符串,请输出这两个字符串的最大公共子序列输入格式两行,一行一个字符串(不包括空格,Tab键),长度不超过1000输出格式输出最大公共子序列的长度输入样例abbcaaba输出样例3作者 admin题目分析题目的意思是,给出两个string,str1,str2,找出这两个串的最长公共子序列,例如:str1:abbca str2:aba这两个字符串的最长公共子序列是:aba,注意子序列中的字母必须在主串中可以全部找到,不原创 2021-05-12 11:01:34 · 257 阅读 · 0 评论 -
18724 二叉树的遍历运算
Description二叉树的三种遍历都可以通过递归实现。如果我们知道一棵二叉树的先序和中序序列,可以用递归的方法求后序遍历序列。输入格式两行,第一行一个字符串,表示树的先序遍历,第二行一个字符串,表示树的中序遍历。树的结点一律用小写字母表示。输出格式一个字符串,树的后序序列。输入样例abcdebcade输出样例cbeda方法1:利用先序遍历和中序遍历的数据来确定整棵树的结构,然后根据这棵树的结构来进行一次后序遍历即可。那么应该如何来进行这样的操作呢?首先先明确先序遍历和中序遍历的原创 2021-04-24 11:33:29 · 614 阅读 · 0 评论 -
分苹果问题
题目可以描述为,现在有M个苹果,有N个盘子,允许有的盘子是空的,请问会有几种分苹果的方法?本题的关键是:盘子可以是空的,可以是非空的,根据这一点我们可以知道,每一种方法的状态是,有空盘和没有空盘,那么在一种状态下,可以通过改变每个盘子中苹果的个数来改变每一种方法,来新得到一种方法,那么也就是说通过每一次的递归,由上次的全局状态进行微调,得到当前的局部状态,在下一次的递归中由当前的局部状态来得到新的局部状态,直到遇到递归边界,那么递归边界是什么呢?苹果都放完了,不可能还有别的局部状态的时候,那么这时候就是原创 2021-04-13 20:06:53 · 883 阅读 · 2 评论 -
走楼梯问题
题目描述为,现在有一个人,需要到达m阶的楼梯,这个人可以选择一次迈一步,或者一次迈两步,问:在到达目的地之前,会有几种方式到达目的地?(注意:比如要到达第4层,那么可以有1 1 2 或者2 1 1这些都可以看做是不一样的)题目很简单,需要做的是递归分治,每一次的前进都可以有两种选择,选择迈两步或者迈一步,递归边界是m为0或者是m<0,而且方法种数是根据迈一步和迈两步之和求出来的。#include <iostream>using namespace std;int Stairs(原创 2021-04-13 19:39:04 · 195 阅读 · 0 评论 -
N皇后问题
N皇后问题可以简述为,在N*N的棋盘上,有N个皇后,为了确保这些皇后不会互相攻击,需要这些皇后不在同一行,同一列,同一对角线上,请用递归的方法来解决问题。思路:考虑到每个皇后的摆放决定都是同一个规则,那么也就是说是把庞大的问题逐步缩小分治直到达到target。需要注解的是,由于皇后是逐行放置的,所以横向的就可以不用考虑,而竖向的和斜向的就需要考虑,这一点我们在设计判断语句的时候可以利用起来,那么对于行,我们只需要判断当前的列数与前面那一个的列数是不是一样的就可以了,但是对于对角线的,我们发现比较难判断,原创 2021-04-13 19:28:52 · 446 阅读 · 0 评论 -
算法(图的遍历)
初识图图:图简单来说,是由一些小圆点(称为顶点)和链接这些小圆点的直线(称为边)组成的。时间戳:按照图中顶点访问顺序,我们把这些访问顺序称之为时间戳。那么遍历的方式,我们在之前已经学过了广度优先搜索和深度优先搜索,现在来复习一下:深度优先搜索:首先从一个未走到过的顶点作为起始顶点,沿着这个顶点的边去尝试访问其他未走到过的顶点,每走到一个顶点,就沿着这个顶点边去走其他未走到过的顶点,直到到达最末端,然后返回,尝试从别的边来访问其他的点,直到又到达另外一个末端,一次往复,直到整个图都没有了可走的边为止。原创 2021-02-17 16:17:04 · 265 阅读 · 0 评论 -
18276 走迷宫 (BFS)
同DFS的问题引入,计算迷宫中的最短路径问题:方法是通过一层一层扩展的方法来达到目标位置,扩展时每发现一个点就将这个点加入到队列中去,直到达到目标位置。这个方法的核心思路是模拟路线,每当没写一个新的可能,就把这个可能入列,直到达到位置,然后在所以的队列中,取最短的队列即可解决问题。队列操作准备:struct note{ int x;//表示横坐标 int y;//表示纵坐标 int s;//表示步数};struct note queue[2501];//由于地图是50*50原创 2021-01-23 23:30:44 · 988 阅读 · 2 评论 -
算法(枚举)
枚举:枚举的算法核心是列出所有可能的答案种类,并且逐个尝试,直到找到答案为止,但在实际操作中,我们往往不会直接将所有的数据直接进行判断,而是通过设计,把一些显而易见不是答案的数据排除掉,这是枚举在使用时的核心。例题:那么我们在设计这道题的算法的时候,由于高峰都是在同一天,那么我们可以先找到所有的体力高峰的日期,这样就大大缩小判断的次数,从而使得枚举更加有效,代码如下:#include <iostream>#include <cstdio>using namespace st原创 2021-01-23 23:30:31 · 276 阅读 · 0 评论 -
18440 走迷宫2 (DFS)
问题引出:输入一个数n,输出1~n的全排列,在运行时间十分有限的情况下(不能直接暴力枚举),该如何解决这个问题呢?假设现在有3个号码牌,要将其放入有序地三个盒子中,并且每个盒子有且只能放一个号码牌,问有几种放法?代码分解:1.往盒子中放入号码牌的操作:for(i=1;i<=n;i++){ a[step]=i;//将i号扑克牌放入第step个盒子中。}数组a是用来表示盒子的,step表示当前正处在第step个小盒子的前面,a[step]=i表示的就是把i号扑克牌放入到第step个原创 2020-12-19 14:17:24 · 878 阅读 · 1 评论 -
算法基础(基础知识)
1.题1:7744问题输出所有形如aabb的4位完全平方数(即前两位数字相等,后两位数字也相等)#include<stdio.h>#include<stdlib.h>#include<string.h>#include<math.h>int main(){ for(int a =1;a<=9;a++) { for(int b=1;b<=9;b++) { int n原创 2020-12-12 10:20:40 · 552 阅读 · 0 评论