- 博客(35)
- 收藏
- 关注
原创 二分查找模板
二分法第一种写法第一种写法,我们定义 target 是在一个在左闭右闭的区间里,也就是[left, right] (这个很重要非常重要)。//即right也能取到区间的定义这就决定了二分法的代码应该如何写,因为定义target在[left, right]区间,所以有如下两点:while (left <= right) 要使用 <= ,因为left == right是有意义的,所以使用 <= if (nums[middle] > target) right 要赋值为 mi
2022-05-26 22:10:19
233
原创 画解数据结构之队列之单调队列
最值问题第一题typedef struct {struct Queue q1;struct Queue q2;//存最大值int idx;} MaxQueue;MaxQueue* maxQueueCreate() {MaxQueue* ret=(MaxQueue*)malloc(sizeof(MaxQueue));QueueClear(&ret->q1);QueueClear(&ret->q2);ret->idx=0;return.
2022-05-04 17:08:23
1123
原创 画解数据结构刷题之队列之FIFO队列
简单队列第一题int timeRequiredToBuy(int* tickets, int ticketsSize, int k){int cnt=0;int i=0;while(tickets[k]!=0){ if(tickets[i]>0) { tickets[i]--; cnt++; } i++; if(i==ticketsSize) .
2022-05-03 00:23:20
295
原创 画解数据结构之队列
一。概念队列是仅限在一端进行插入,另一端进行删除的线性表。 队列又被称为 先进先出 (First In First Out) 的线性表,简称 FIFO 。进行元素删除的一端为队首插入的一段为队尾二。队列的顺序表实现1.数据结构实现struct queue{Datatype data[maxn];int head,tail;}2.入对void QueueEnqueue(struct Queue *que, DataType dt) { // (...
2022-05-01 21:04:46
752
原创 画解数据结构刷题之栈之单调栈
单调栈第一题typedef struct { int stack[10000]; int stacktop; int minstack[10000]; int minstacktop; }MinStack;//辅助栈,栈顶存最小值;MinStack* minStackCreate() { MinStack* newStack = (MinStack *) malloc(sizeof(MinStack)); newStack->.
2022-05-01 01:12:35
420
原创 画解数据结构刷题之栈之lifo栈
LIFo栈之逆序链表第一题int* reversePrint(struct ListNode* head, int* returnSize){int vec[10000];//辅助栈int top=0;struct ListNode*cur=head;while(cur)//入栈{ vec[top++]=cur->val; cur=cur->next;}int i=top;*returnSize=i;int temp=0;int*ret=(int
2022-04-29 15:52:08
208
原创 画解数据结构1-4栈
一.概念1、栈的定义 栈 是仅限在 表尾 进行 插入 和 删除 的 线性表。2、栈顶 栈 是一个线性表,我们把允许 插入 和 删除 的一端称为 栈顶。二。栈的顺序表实现1、数据结构定义对于顺序表,在 C语言 中表现为数组,在进行栈的定义之前,我们需要考虑以下几个点: 1)栈数据的存储方式,以及栈数据的数据类型; 2)栈的大小; 3)栈顶指针;我们可以定义一个栈的结构体,C语言实现如下所示:#define DataType int ...
2022-04-27 02:19:41
330
原创 画解数据结构刷题之循环链表
循环链表第一题struct Node* insert(struct Node* head, int insertVal) { struct Node*new=malloc(sizeof(struct Node)); new->next=new; new->val=insertVal; if(head==NULL) {head=new;head->next=new;return head; } struct N.
2022-04-27 01:43:56
304
原创 画解数据结构刷题之单向链表(翻转函数)
链表回文第一题bool isPalindrome(struct ListNode* head){struct ListNode*cur=head;struct ListNode*vec[100001];int i=0;while(cur){vec[i]=cur->val;cur=cur->next;i++;}int p=0;int q=i-1;while(p<q){ if(vec[p]!=vec[q]) { ret
2022-04-26 14:29:21
226
原创 画解数据结构刷题1-3单向链表
链表旋转第一题struct ListNode* rotateRight(struct ListNode* head, int k){if(k==0||head==NULL||head->next==NULL){ return head;}struct ListNode *vtx=head;int len=1;while(vtx->next){vtx=vtx->next;len++;}vtx->next=head;k=k%len;int a
2022-04-23 00:15:30
1421
原创 画解数据结构1-3 单向链表
一。链表概念1.链表定义由于顺序存储的结构,如数组,插入和删除时要移动大量元素,人们发明了链表链表由一个个结点组成,每个结点每个 结点 之间通过 链接关系 串联起来,每个 结点 都有一个 后继节点,最后一个 结点 的 后继结点 为 空结点。链表分为单向链表、双向链表、循环链表等等,本文要介绍的链表是单向链表2.结点结构体定义typedef int datatype;struct ListNode{datatype data;ListNode *next;//next指...
2022-04-21 16:27:13
1395
原创 画解数据结构1.1线性枚举之二维数组 字符串强转数字
第一题先排序,后双指针,如相等就插入,双指针++,不相等就小的++第二题void swap(char*a,char*b){ char temp=*a; *a=*b; *b=temp;}int cmp(const void*a, const void*b){ return *((char*)b)-*((char*)a);//从大到小}int maximumSwap(int num){ int m;if(num==0){..
2022-04-20 21:36:33
304
原创 画解数据结构 1-2 字符串
知识点:1.字符串是特殊的字符数组,有结尾字符\02.用strlen(c)获取字符串长度3.字符串遍历的三种结束方式:1.strlen2.s[i]='\0'3.s[i]==0知识点4.大小写转换s[i]-'A'+'a'5.字符串拷贝strcpy(a,b)6.字符串比较strcmp(a,b)//区分大小写7....
2022-04-20 01:25:00
123
原创 画解数据结构刷题 线性枚举之原地算法
第一题属于是做了又忘了定义快指针和慢指针,快指针用来检验,慢指针用来储存,因为是升序排列,所以相同的数只会存在于数的左右,所以检验快指针时,只需要检验快指针-1的位置,如果相等,则无需改变,只需将fast++,检验下一个数,如果不相等,则说明fast与之前的数都不相等,就用fast指针的数代替slow指针的数,并且将fast和slow都++...
2022-04-20 01:09:36
129
原创 画解数据结构1.1习题线性枚举之最值算法
线性枚举之最值算法1.j从i+1开始遍历二.只能是1或0,是1就count++,并更新maxc,是0就将count置零三。之前做过但忘得差不多了,每次取mid将其与high进行比较,>high就说明mid在最小值左边,所以更新边界四。唯一区别是数组元素可以相等所以区别是当mid与high数值相等时,无法判断最小值究竟在哪个区间,所以此时抛弃右边界,将right=right-1五。...
2022-04-18 23:48:11
111
原创 画解数据结构1.1顺序表 排序 二分查找
顺序表顺序储存,是指用一段地址连续的存储单元依次存储线性表的数据元素。数据结构定义#define maxn[10000]#define Datatype intstruct leqlist{Datatype data[maxn];int length;}2.常用接口(1)索引:通过数组下标寻找数组元素Datatype SeqlistIndex(struct Seqlist *sq,int i){return sq->data[i];}(2)查找...
2022-04-18 20:34:16
225
原创 算法100讲9 10讲
第九讲:算术基本定理从o(n)到o(根号n)的优化,只需遍历1到根号n,如果是素数,并且i的平方不等于所给数,就把num/i加进去第十讲
2022-04-17 22:05:04
131
原创 算法100讲7和8
第一题bool judgehuiwen(int n){ int temp; int hui; int old=n; if(n<10) { return true; } while(n!=0) { temp=n%10;//末尾 n=n/10; hui=hui*10+temp; } if(old==hui) { return
2022-04-16 21:21:05
160
原创 算法100讲第五六讲计数法(cmp,sscanf)
小知识:1.如果函数中需要用到数组int hanshu(int*ret)即可,不需要returnsize,也不需要申请空间,因为不返回数组2.1<<21移位符的妙用:2的21次方day5 计数法:计数法的含义顾名思义,就是利用一个变量,记录下某个数值出现了多少次。从而实现对数值的计数。第一题需要找和为2的幂的数对,可以改变思路枚举2的幂,枚举一个数,检查另一个数在不在数组中第二题若为字符串,则将char减去'a'得到其排序\...
2022-04-14 16:04:09
261
原创 算法100讲1-2 滑动窗口思路+二维指针注意事项
我的思路:两次for用公式求解思路2:滑动窗口从左边界为1,右边界为2开始滑动,如果sum<target,右边界+1,如果加完之后还小于,继续加,一直加,加到(1)如果=target,就记录下该序列,并且左边界+1(2)>target,就说明从左边界开始的序列不可能满足,所以左边界+1...
2022-04-13 21:27:58
183
原创 解题报告(9)简单递归
第一题我的思路:循环判断阶乘尾数是否为0但似乎阶乘太大溢出了标答的思路是寻找阶乘中有几个尾数0,就是在找阶乘里有几个因子10如11!=11*10*(3*3)*(2*4)*7*(2*3)*5*4*3*2*1由于10只能由2*5组成,所以就是在找阶乘中有几对2和5,由于2肯定比5多,所以只要找有几个5就可以了,正常想法是每5个有一个,所以n/5,而25中有2个5,所以如27中5的个数为27/5+27/25因此是return n/5+trazeroes(n/..
2022-04-12 19:06:15
96
原创 解题报告(8)二级指针
二级指针定义int x=1;int *p=&x;int **op=*p;二级指针往往与二维数组有关当函数返回值为二维数组时申请二维数组模板returnsize是行,returncolumnsize是列先为**ret申请一个二维数组的内存int **ret=(int **)malloc(sizeof(int*)*r(列))...
2022-04-10 23:09:49
377
原创 c语言313233
第一题用无哈希冲突的哈希表实现递增输出数组构造数组h[maxn]当循环输入n时,h[n]++,h[n]=j表示n出现了j次输出时,循环输出,有h[n]=j则输出j个n第二题重点:(1):学会使用memset使数组清零memset(h,0,sizeof(int)*numsSize)//(数组名,初始化数值,sizeof(类型名))(2):不能直接ret[num[i]]++因为num[i]范围是1到n,而n的时候num数组已经溢出因此,将7存在6...
2022-04-10 00:27:47
74
原创 c语言2829
我的思路是循环看删除第i个之后是否严格递增,但不会调用有数组形参的函数思路:双指针双指针一快一慢,起初都指向1,快指针当数组元素与前一元素相等时,就会+1,不相等时,将此时的数值复制给慢指针,并且将慢指针+1快指针用来找不同的数,慢指针用来保存并输出最后的数组...
2022-04-09 18:00:40
1306
原创 解题报告(7)二维数组
a[i][j]:表示第i行第j列初始化时 a[][j]:第一个数字因为初始化时可以知道数组中元素个数,所以可以省略int diagonalSum(int** mat, int matSize, int* matColSize){ r = matSize; c = matColSize[0]; // TODO}int *matclosize是一维数组,表示有多少列,matclosize[0]说明第0行有matclosize[0]列第一题...
2022-04-09 15:39:26
68
原创 c语言2627
int countLargestGroup(int n){ int ret[37]={0}; int sum; int maxn=0; int cnt=0; int temp; for(int i=1;i<=n;i++) { sum=(i/1000%10)+(i/100%10)+(i/10%10)+(i%10); ret[sum]++; } for(int i=0;i<=36;i++) { ...
2022-04-09 00:25:02
1176
原创 解题报告(6)
思路:原本想的是判断最轻的两个人能否坐上,但贪心应该考虑符合情况的最优情况,即从重的开始考虑,如果最重的连最轻的也不能一起坐,那么最重的一定自己坐
2022-04-08 21:39:52
108
原创 解题报告(5)排序API
int v1=*(int *)p1int *为类型强转,最前的*为解引用sort函数的比较函数中,若返回值为1或正数,则说明保持原有的顺序,(ab)负数则翻转第一题简单使用qsortqsort函数:最后一栏比较函数cmp为谓词部分sort函数的比较函数中,若返回值为1或正数,则说明保持原有的顺序,(ab)负数则翻转第二题第三题思路:升序排列数组,for循环遍历判断该元素和下一元素,相等则输出int cmp(const...
2022-04-07 22:28:51
72
原创 c语言100例25题
#include <stdio.h>const int N = 5;int h[6];int main() { int i, j, k, l, m; for(i = 1; i <= N; ++i) { h[i] = 1; // (1) for(j = 1; j <= N; ++j) { if(h[j]) con...
2022-04-07 09:23:32
381
原创 c语言100例22题
最大公约数(1)循环枚举(2)辗转相除c是a的约数也是b的约数,推出c也是r的约数所以a和b的公约数也是b和r的公约数因此递归求解
2022-04-07 07:25:43
215
原创 解题报告(4)指针和数组
范式返回一维数组时,由于数组无法被直接传回,所以需要返回ret(数组首元素)和数组大小(*returnsize 指数传参)int*ret=(int*)//类型强转//malloc(sizeof(int)*//乘号numsize)// 为数组申请内存*returnsize=xxx(改变后输出的数组大小)字符串的特殊:申请内存时要多申请一位加上return[n](数组最后一位)='/0'则加上结尾标识,可用strlen得到数组长度第k位左旋公式...
2022-04-06 22:45:47
71
原创 解题报告(3)数组
第一种:for循环遍历第二种:利用二分查找思想步骤(1):定义左边界,右边界,中点mid(2):由于数组经过旋转,被分为两个有序序列,而以mid为界,其左右必有一个有序序列所以先以(nums【0】<mid)为判断条件,判断哪个是有序序列(3):判断target是否在有序序列中附二分查找模板第二题:数组仍升序,但可能存在相同数字添加特殊情况左界和右界和中点都相等即将左右边界都+1(一定不是target)第三题...
2022-04-05 23:17:39
411
原创 解题报告(2)循环
第一题 不使用加减乘除实现前n项和递归第二题判断是否是2的幂并非所有偶数都是2的幂是2的幂的偶数的性质是无论怎么除以2最终都是个偶数(如36-18-9)因此判断条件为n%2=1且n不为1(n/2!=0)最后递归n/2第三题同理第四题判断n是否为2的幂还可以用n&(n-1)==0n为2的幂说明n仅有一位高位为1,其余全为0;此时n-1仅有一位高位为0,其余全为0;所以n&n-1在n>0的情况下当且仅当n为2的幂时成...
2022-04-04 16:51:35
220
原创 解题报告(1)函数
第一二三题相同的题目,就放在一起了unsigned防止溢出int(a&b)<<1表示应该进的位(需进的位左侧为1)如果没有进位,则直接是a^b如果有进位则将temp(需进的位)给b,并以他是否为0为循环条件,继续a^b(此时b已右移一位)...
2022-04-03 22:29:33
70
空空如也
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人