- 博客(30)
- 问答 (3)
- 收藏
- 关注
原创 数据结构——链表
链表有单向链表和双向链表,还有循环链表。双向链表有前指针和后指针,循环链表在此基础上最后一个节点的指针指向第一个节点。链表包含若干节点,每个节点由存储单元和指针组成。即node 包括 val (存储的内容)和next(指针,指向下一节点)在节点类的基础上实现链表。适合链表的排序算法:冒泡排序、选择排序、插入排序、归并排序、快速排序、计数排序、桶排 序、基数排序。不适合链表的排序算法:希尔排序。可以用于链表排序但不建议使用的排序算法:堆排序。一些简单的题目有leetcode 707、203、82。
2025-02-08 16:16:39
179
原创 二分查找——题目详解(278、33、4、875)
当长度为奇数时是找出第(m+n+1)//2个数,为偶数是找出第(m+n)//2和(m+n)//2+1,求平均值。在本题需要注意的是,如果m是错误版本,则需要变更右边界,但是当前的m可能就是答案,所有不能r=m+1,需要写成r=m。有个数组nums 原本是升序,但是有k+1一个移到了数组前面,因此数组被分为两个有序数组[0,k]和[k+1,len(nums)-1],分别使用二分查找。有两个正序数组,需要找出它们合并之后的中位数,时间要求O(log(m+n))。思路都一样,题目的区别是154有重复的数。
2025-01-31 20:23:20
254
原创 算法入门--二分查找
思路,每次比较目标值与数组中间位置值,根据比较结果来返回目标值位置(nums[mid]==target),或者改变数组的左边界、右边界,或者返回-1(数组中不存在target)。与上一题相似,如果数组中没有target值的话需要返回插入位置,循环条件是l<=r,因此数组中没有target值的时候l=r+1正好是插入位置,return l 即可。69、x的平方根 输出m时需要添加条件(m+1)**2>x,确定x是在m^2,(m+1)^2之间。(3)、(4)是与(1)、(2)对应的写法,可以。
2025-01-29 12:08:47
331
原创 十大排序算法的粗略总结——了解向
排序后的数组一般是从小到大[0,1,2,3] 当数组为[3,1,2,0],称数组中有逆序,比如3和1、3和2、3和0、1和0、2和0。排序完成后数组的逆序对数量应该为0,所以排序其实是消除逆序对的过程。:使用计数数组记录arr中的数组出现的次数,完成后依次输出计数数组的数组。:按照一定的规律将待排数组划分到不同的桶(比如数组),每个桶单独排序,排序稳定性取决于排序方法。:记录数组中最大的数的位数,依次对位进行计数排序。:依次将未排序的数遍历比较,插入已排序的数组,优化:提前结束优化和冒泡界优化。
2025-01-22 17:21:01
170
原创 LeetCode排序算法
使用字典进行存储,原数组的数按照大小分配到不同的桶:nth=nums[i]//(valueDiff+1),这样子只有同一个或相邻的桶中的数值满足差的绝对值的约束。思路与快排类似,用zero,two记录0、2的下标,使用i遍历数组,当找到0/2时将i与对应下标的nums交换。由于给出的是两个有序数组,在为结果数组添加数字的时候直接比较两个数组的最后一位即可插入数组。使用分治算法,将数组切分,在每次和并的时候统计当前左数组和右数组之间逆序对的数量。75、颜色分类,有三种值0、1、2需要将他们排序。
2025-01-21 22:46:27
308
原创 排序算法 Day08
在这一部分需要注意的是:开始时将pivot和nums【0】的值交换,便于遍历。选定一个值作为pivot,用于比较数组中的值,比pivot小放在左边,大在右边,一般pivot选数组中间的一个数。如果某二叉树节点(非叶子节点)的下标为𝑖,那么其左孩子节点下标为2×𝑖+1,右孩子节点 下标为2×𝑖+2。计数排序:使用count记录每个值出现的次数,进行排序,比较巧妙的是最后给结果数组赋值的写法。• 如果某二叉树节点(非根结点)的下标为𝑖,那么其根节点下标为⌊𝑖−1 2 ⌋(向下取整)。堆结构是一棵完全二
2025-01-20 21:34:55
240
原创 排序算法Day07
和笔记中的有一定出入,主要是少了temp变量,因为写的时候感觉对于每一组间隔为gap的数,只要满足第二个while的条件的话就会自动把这一组数都排序好了,不需要temp记录了。mergesort中将数组进行分解,由于归并是递归调用的,注意终止条件,为传入的数组不可分的时候。将数组按gap划分比如nums[0]和nums[0+gap]是一组,比较每一组中的数,进行排序。逐步减小gap的值。要求在O(nlogn)的时间复杂度,一开始以为希尔排序不行,去看了解析,发现是可行的。主要内容:归并+希尔。
2025-01-19 19:57:19
136
原创 Day06 数组排序
方法二、用i遍历数组,i0用于记录i查找到非零的数需要移动的位置,每次移动了一个非零数后i0+1,这样可以让非零得数按原来的相对位置移动到数组的最左侧。练习题LCR164、破解闯关密码,按选择排序发现做不出来,因为数组中的数是包含两位数的,按大小排序会导致【13,4】排序之后是413,而不是134。对含有n个数的数组,需要运行n-1趟(i),对每个运行过一趟,冒泡时都可以减少一个遍历的数(j),通过flag可以在减少循环次数。方法一、遍历数组,如果其中的某个元素等于0就先删除,再在数组的尾部添加0。
2025-01-18 12:53:03
159
原创 LeetCodeDay05
59、螺旋矩阵2 :还是使用螺旋矩阵一的思路,使用上下左右边界,循环完之后改变边界值,由于这题的矩阵中的数是明确的,采用count计数作为跳出循环的条件。289、生命游戏 法一:使用新数组用于记录细胞的生死,在创建时考虑到边界的细胞的处理问题创建了M+2*N+2的数组,根据题意边界用零填充不影响判断。还有根据newboard判断时需要注意到board的下标ij都需要加一才能对应上。方法二 分析题目,细胞前后各有0,1两种状态,则最多有00,01,10,11两种状态。需要学习创建新二维数组的方式。
2025-01-15 18:39:19
243
原创 LeetCodeDay03-数组基础
链接:https://leetcode.cn/problems/rotate-array/solutions/724、寻找数组的中心下标(使用sum存需要比较的值,而不是每一次都重新相加)访问、查找、插入(append,insert)、删除(pop、remove)189、轮转数组(一开始想依次移动数组中的数,但是数组大的时候会超时)66、加一(使用shi记录进位,如果最后一位有进位则append0)k%=n#轮转k次等于轮转k%n次。二、出自题解(开一个新的数组、
2025-01-14 18:47:58
357
原创 LeetCode算法笔记Day04
498、对角线遍历(一开始想是像上面一题,然后发现只要只要移动行和列就可以斜向上遍历或斜向下遍历)需要注意每一次到边界后row,col的值如何改变。73、矩阵置零(方法一是直接使用一个同样大小的矩阵记录0,二是用第一行和第一列记录该行\列中是否有0,加上对第一行第一列是否有零的标记)54、旋转矩阵 (用left,right,up,down确定遍历的边界)48、旋转图像(思路是将矩阵左上、右上、左下、右下的点旋转)238、除自身的乘数(分别求左侧和右侧的乘积)O(n)
2025-01-14 18:40:44
1505
原创 LeetCode算法笔记Day02
1480、一维数组的动态和(在遍历时依次改变nums【i】的值,这样只需要遍历数组一次)return [nums[0]] #输出数组/链表。709、转换小写字母(使用函数/ 字典替换,详见leetcode解析)1672、最富有账户。
2025-01-14 18:40:04
172
原创 LeetCode算法笔记Day01
numDict[nums[i]] = i#存入字典中。:字典中没有的key不可以直接+=,可以直接赋值、py的判断条件)1929、数组串联(在py中很简单,直接相加就行)0771、宝石与石头(
2025-01-14 15:08:00
199
原创 数据结构——树(搬运知识点以及一些简单的解释)
1、树是n (n≥0) 个结点的有限集, 如果n=0,称为空树;如果n>0(1) 有且仅有一个称为根的结点root(2) n>1时,其余结点可分为m个互不相交的有限集T1 … Tn,其中每一个集合又是一棵树,称为根的子树2、度与节点¯(1)结点的度:结点拥有的子树的个数。¯(2)树的度:树内各结点的度的最大值。¯(3)叶结点:度为0的结点。¯(4)分支结点:度不为0的...
2022-05-27 11:59:06
296
原创 最佳编码
#include<queue>#include<xstring>#include<iostream>#include<cstring>#include<stdio.h>using namespace std;int n, m, ans;int num[30];string str;int bfs() { int sum = 0; priority_queue <int, vector<int>,.
2022-02-28 19:40:58
212
原创 救救dingba (和天使差不多)
先摆错误代码#include<iostream>#include<queue>using namespace std;int n, m,ans;char map[201][201];int dir[4][2] = {{1,0},{-1,0},{0,1},{0,-1}};struct state { int x; int y; int ti; friend bool operator<(state s1,state s2) { ret
2022-02-28 16:50:20
344
原创 s-nim(一道很麻烦的题)
首先会输入一个n 代表有n种抽牌方式,紧接着n个数字输入;然后是m表示有m组数据需要判断在这n种抽牌方式下第一个抽牌的人是输或是赢 最后输出m个L/W(这里不太会处理,直接用数组存了)最后输入0表示输入结束需要注意的就是需要将n种抽牌方式进行从小到大的排序,不然sg函数中的break要改为continue,还有就是sg函数的写法需要熟练#include<iostream>#include<cstring>#include<algorithm>u
2022-02-26 21:13:34
312
原创 Public Sale (输出获胜方式)
Problem Description拍卖的规则是这样的:刚开始底价为0,两个人轮流开始加价,不过每次加价的幅度要在1~N之间,当价格大于或等于田地的成本价 M 时,主办方就把这块田地卖给这次叫价的人。由于Lele字典序比Yueyue靠前,所以每次都是由Lele先开始加价,请问,第一次加价的时候,Lele要出多少才能保证自己买得到这块地呢?Input本题目包含多组测试,请处理到文件结束(EOF)。每组测试占一行。每组测试包含两个整数M和N(含义见题目描述,0<N,M<1100)
2022-02-26 20:17:55
151
原创 Being a Good Boy in Spring Festival(nim博弈的取胜方式数)一些超详细的推导
m堆牌,每次只能选择一堆牌抽取任意张(所以sg(n)=n)。用s储存所有sg函数的异或值。根据题意可以知道是如果选择a【i】(第i堆,牌数为a【i】)最多可以抽a[i]张(废话),怎么样可以取胜呢——令抽取了x张牌后的nim和等于0。也就是说,s^a[i]^(a[i]-x)==0; (s^a[i]等于除了a[i]之外所以数的异或值)又因为一个数和它本身求异或值的话也就等于0,所以可以得出s^a[i]==a[i]-x (抽任意张牌,x肯定大于0),又因为x到底是几我们不确定,但是肯定大于零,所以可以把判断
2022-02-26 13:20:10
753
原创 二分匹配 棋盘游戏
大意就是在棋子只能放在给定的格子之中,并且在某一格子(x,y)放了棋子后x行,y列不能再放棋子。重要点就是如果某一点不能放棋的话,可以放置棋子的最大数量就会减少。然后要求第n块棋盘有几个重要点,最多可以放几个棋子然后比较不同的地方就是求重要点。要用已经求出的最大匹配数 rd 与去掉某点之后的最大匹配数(将map[i][j]=0(屏蔽该点之后再调用函数hugary()))最后不要忘了令map[i][j]=1;进行复原操作。#include<iostream>#include<
2022-02-25 20:11:45
3006
原创 过山车 二分匹配的最大匹配
用了匈牙利算法,简单来说就是能不能把新的左点和右点连线#include<iostream>#include<cstring>using namespace std;int an, bn, k,a,b,ans;int map[501][501],linker[501]; bool vis[501];bool dfs(int a) { for (int b = 1; b <= bn; b++) { if (map[a][b] && !vis[
2022-02-24 16:10:04
94
原创 oil deposits (dfs)
题意:有油的地块和邻近八个方向的有油地块算作1片油田。看到题之后又是正常懵逼。用x,y的位置表示每个点的状态,然后如果符合条件就将地块标记为不符合条件的地块就好了。然后在怎么找符合条件的地块卡了一下。(其实遍历就好)两个for循环一上去,符合条件就dfs 然后计数君++#include<iostream>#include<cstring>#include<stdio.h>using namespace std;int Move[8][2] = {
2022-02-23 18:39:03
79
原创 手机的诱惑
#include<iostream>#include<cstring>using namespace std;int Move[4][2] = { {1,0},{-1,0},{0,1},{0,-1} };char map[9][9];int N, M, T; bool judge;int sx, sy, ex, ey;bool in(int a, int b) { return a > 0 && a <= N && b &g.
2022-02-23 16:26:49
578
原创 胜利大逃亡
又卡了一会原本想用优先队列加bfs的(改一改上一题的那个模板)反而还一直超出内存,因为没有用vis标记剪枝。又想了一会,为什么这个不用呢,因为他要求的时间是每一次行动所需都相同的,不像上个rescue里面有守卫需要2点行动力,所以就是正常用bfs就好了。然后是三维数组map[a][b][c],a表示层数(或者说是深度,高度)b表示行,c表示列这样。一开始想都没想,Move用了三维数组表示移动的情况,但是其实没必要,(浪费了好长时间)。#include<iostream>#includ
2022-02-22 22:09:44
102
原创 knight moves
整整一天!一开始想着用最基础的bfs(单向)并且最暴力的if()穷举8种走法,然后一直报错(还查不出来哪里错误了。)然后用循环 直接ac舒服了
2022-02-15 20:48:53
512
原创 piggy bank(背包算法)
为什么要发呢? 这个鬼题目卡了我整整5天(主要因为本人是懒狗,然后还粗心)一直ac不了 然后看别人的写法也和我差不多。最离谱的是最后才想到可能是输出的格式不对( 之前一直是piggy - bank)一定要引以为戒好吧
2022-02-15 11:22:23
394
原创 bfs 非常可乐
大体上也就是个bfs 只是情况多,然后个人感觉这算是比较麻烦的写法(但是也耗了好久,太粗心了if()后面总是漏掉{}然后一直报错。划重点:!大体上的思路就是三个杯子选两个互相倒水,不怎么动脑的话就是像上面这样,分情况写。然后就是根据当前杯子的可乐的量和目标杯子的剩余容量(也分情况,但是后面两个杯子的水量相加才等于第一个杯子的量,所以就可以直接省略掉一种情况)来决定倒水后怎么计算。
2022-02-15 11:18:08
221
空空如也
关于delete删除堆空间出错的问题
2022-05-22
sort函数中有关 将一个无效参数传递给了将无效参数视为严重错误的函数
2022-01-23
float输出显示的变化
2022-01-10
TA创建的收藏夹 TA关注的收藏夹
TA关注的人