算法实现
大聪明ing
共同努力,共同进步!
展开
-
寻找数组的中心索引
寻找数组的中心索引,中心索引的两边元素之和相等原创 2022-07-08 11:39:17 · 368 阅读 · 1 评论 -
二叉树的序列化与反序列化
二叉树的序列化与反序列化原创 2022-07-08 11:27:20 · 244 阅读 · 0 评论 -
二叉树最近公共祖先
递归与非递归方式实现二叉树最近公共祖先原创 2022-06-24 09:59:23 · 2490 阅读 · 1 评论 -
填充每个节点的右侧节点指针
满二叉树填充节点的右侧节点指针原创 2022-06-22 10:16:41 · 160 阅读 · 0 评论 -
对称二叉树
对称二叉树的两种实现方式,递归实现,非递归实现原创 2022-06-18 10:02:51 · 891 阅读 · 0 评论 -
二叉树深度
二叉树深度通过自顶向下,自底向上的方式求解原创 2022-06-16 09:18:44 · 69 阅读 · 0 评论 -
二叉树的遍历
二叉树的遍历原创 2022-06-12 10:20:51 · 90 阅读 · 0 评论 -
C语言实现查找链表中间结点
如果链表有奇数个结点,就直接返回中间的结点,如果有偶数个结点,就有两个中间结点返回中间第二个结点比如[1,2,3,4,5]中间结点是3[1,2,3,4,5,6]中间结点是4一、通过链表长度进行计算1. 计算链表结点个数需要遍历一次,所以首先遍历一次链表,计算链表结点个数。2. 计算出结点个数,然后计算中间结点,无论是奇数还是偶数都是length/2+1。3. 找出这个结点返回即可。#include<stdio.h>#include<stdlib.h> struct原创 2022-04-28 18:30:34 · 2674 阅读 · 1 评论 -
C语言实现翻转字符串中的单词
一、另外开辟一个空间,来存放翻转的字符串单词之间是以空格间隔的,所以我们翻转需要一个一个字符进行翻转,我们需要找寻空格,找到空格表示一个字符已经找到,进行以下的步骤:1. 首先获取原字符串的长度,申请一个长度+1的空间,因为还需要一个结束符。2. 定义一个变量i,初始化为0,用i进行字符串的遍历,定义一个start用来表示每个单词的起始位置。3. 遍历字符串,不是空格i++,直到遇见空格,表示找到了一个单词。4. 将该单词从末尾放到咱们新开辟的数组中,就实现了逆序。5. 空格也需要放到临时数组原创 2022-04-26 20:50:48 · 2961 阅读 · 0 评论 -
C语言实现搜寻插入位置
数组是有序的,给定一个值,在数组中查询当前值,如果又返回其索引,没有的话,返回该元素按顺序排列的位置比如:数组元素:{1,3,5,6},给定元素6,应返回3,给定元素0应返回0首先数组是有序的,我们可以考虑使用二分查找来查询元素查找元素范围是可变的,找到元素直接返回所在索引找不到元素,左右区间是可变的,如果要插入位置在区间中间的右边left是要大于right的,此时left位置就是元素要插入的位置left,如果要插入位置在区间中间的左边,right是要小于left的,此时left就是要插入位置,可原创 2022-04-24 19:58:04 · 1190 阅读 · 0 评论 -
C语言实现二分查找
实现二分查找,找到元素返回元素位置,找不到返回-1。数组是有序的。所以我们通过折半查找,循环中我们一直在更新left,right,mid1、先与中间的元素进行比较,2、如果小于中间的元素说明要查找的元素在中间位置的左边,所以我们就将查找的元素缩小到左边。3、如果大于中间元素说明要查找的元素在右边,所以我们将数组缩小到右边。4、否则该位置就是要查找元素。循环退出后表明目标元素没有在数组中返回-1。#include<stdio.h>// nums数组,numsSize数组长度,tar原创 2022-04-23 21:45:14 · 1117 阅读 · 0 评论 -
判断环形链表
题目来源于力扣–https://leetcode-cn.com/leetbook/read/top-interview-questions-easy/xnwzei/1、快慢指针,快指针移动两次,慢指针移动一次,如果两指针相遇,表示链表有环。就像钟表一样,秒针和分针总会指在同一个地方。只要快指针比慢指针快,链表中存在环,两个指针就会相遇。main函数代码:#include<stdio.h>#include<stdlib.h>bool hasCycle(struct ListN原创 2021-11-22 11:01:22 · 147 阅读 · 0 评论 -
判断回文链表
题目来源于力扣–https://leetcode-cn.com/leetbook/read/top-interview-questions-easy/xnv1oc/1、首先最容易想到的是复制一个新的链表,然后将新链表反转,然后与原链表比较,相等的话就是回文链表,否则就不是。但是效率比较低,也占用了一部分新的空间。下面直接看代码:#include<stdio.h>#include<stdlib.h>bool isPalindrome(struct ListNode* head)原创 2021-11-19 12:45:36 · 494 阅读 · 0 评论 -
合并两个有序链表
题目来源于力扣–https://leetcode-cn.com/leetbook/read/top-interview-questions-easy/xnnbp2//1、申请一个结点作为头结点。2、用两个指针指向两个链表,哪个链表的值小就通过尾插法插入到新的链表中。如果值相等,就任选一个作为结点插入新的链表。3、当前链表指针后移。4、直到有一个链表遍历完成。5、将没空的链表的剩余结点连接到新链表。main函数代码#include<stdio.h>#include<stdli原创 2021-11-18 21:32:29 · 363 阅读 · 0 评论 -
实现链表的反转
题目来源于力扣–https://leetcode-cn.com/leetbook/read/top-interview-questions-easy/xnnhm6/1、利用头插法实现链表的反转,从链表第一个节点开始,当前节点作为新的头结点,一直到链表结束。上图:main函数代码:#include<stdio.h>#include<stdlib.h>// 结构体 struct ListNode { int val; struct ListNode *next;原创 2021-11-15 16:52:01 · 611 阅读 · 0 评论 -
删除链表的倒数第N个节点
题目来源于力扣–https://leetcode-cn.com/leetbook/read/top-interview-questions-easy/xn2925/一、最容易想到的方法就是,计算出链表的长度,用长度减去n就是要删除节点的前一个节点,这里要注意的是,如果计算出来的节点位置为0,表示要删除第一个节点,直接头指针往后移一下就可以了。知道了前一个节点,删除后边的节点就好办了。假设指针p指向前驱结点,用一个临时的指针q指向要删除的节点,p->next = q->next,free(q),原创 2021-11-12 15:47:00 · 853 阅读 · 0 评论 -
删除链表中的节点
题目来源于力扣–https://leetcode-cn.com/leetbook/read/top-interview-questions-easy/xnarn7//题目指出,不知道头结点的位置,只知道给出的删除节点,通过这个我们也可以知道要删除节点的下一个节点,所以我们可以这样做,假设要删除节点指针为p,下一个节点指针为q1、p->data = q->data(q指向节点的值赋值给p指向节点的值)。2、p->next = q->next(p的下一个节点指向q的下一个节点)。原创 2021-11-12 11:15:30 · 4248 阅读 · 1 评论 -
最长公共前缀
题目来源于力扣–https://leetcode-cn.com/leetbook/read/top-interview-questions-easy/xnmav1/这里要求的是公共前缀,不考虑中间有相同的字符1、假设第一个字符串为公共前缀,首先和第二个字符串进行比较,找出两个的公共前缀,然后找第三个,直到整个字符串数组完毕。2、利用indexof,找到就返回该字符串第一个字符出现的开始位置,这个题目也就是0,否则就返回-1。3、若没有找到,就截取字符串,删除末尾字符,重复1,2步,直到第一个字符串为原创 2021-11-10 22:04:51 · 243 阅读 · 0 评论 -
实现外观数列
题目来源于力扣–https://leetcode-cn.com/leetbook/read/top-interview-questions-easy/xnpvdm/当时想用c语言实现,但是没有想到好的方法,就用java来实现。原理就是,首先将字符串首位元素取出,依次和后边的元素进行比较,1、如果相等我们就用一个计数器count来保存出现的次数,每出现一次,计数器就加一。2、如果遇到不相等的元素,首先将计数器count和元素添加进字符串,然后将计数器置为0,将当前元素保存继续判断1。3、直到字符串结原创 2021-11-10 12:32:13 · 842 阅读 · 0 评论 -
实现 strStr() 函数
题目来源于力扣–https://leetcode-cn.com/leetbook/read/top-interview-questions-easy/xnr003/给你两个字符串 haystack 和 needle ,请你在 haystack 字符串中找出 needle 字符串出现的第一个位置(下标从 0 开始)。如果不存在,则返回 -1 。采用双指针法,分别指向两个数组的首位,如果两个元素相等,指针同时后移,如果不相等,needle从首位重新开始,haystack从相同元素的刚开始相同位置的下一个位置原创 2021-11-09 20:42:36 · 273 阅读 · 0 评论 -
查找数组中是否有重复元素
如果数组中有至少两个重复元素就返回true,否则就返回false一、这个最容易想到的就是暴力枚举,一个一个遍历,给它一个计数器如果有一个元素出现了两次,直接返回true,剩下的就不走了,否则返回false,这个方法是最容易想到的,但是时间复杂度O(n²),空间复杂度O(1),数组元素较多的情况下,效率很低。main函数下的代码#include<stdio.h>bool containsDuplicate(int* nums, int numsSize);int main(){ int原创 2021-10-22 21:21:11 · 2917 阅读 · 2 评论 -
递归解决奶牛问题
有一头母牛,它每年年初生一头小母牛。每头小母牛从第四个年头开始,每年年初也生一头小母牛。请编程实现在第n年的时候,共有多少头母牛?递归解决问题,首先要找出规律,大的问题需要子问题来解决,不妨假设第n年成年牛数量a[n]中年牛数量b[n]青年牛数量c[n]小牛牛数量d[n]中年牛长成成年牛的那一年就可以生小牛了,成年牛就可以生小牛牛了。a[n] = a[n-1]+b[n-1]b[n] = c[n-1]c[n] = d[n-1]d[n] = a[n-1]+b[n-1]=a[n]假设总数量s原创 2021-11-01 22:00:27 · 578 阅读 · 0 评论 -
最大子列和实现算法(三种方式)-----C语言
首先给出一个main函数,可以直接替换函数即可,我默认写的是五位数,需要多少可以自行替换#include<stdio.h>#define N 5int MaxSubSeq(int list[]);int main(){ int list[N]; printf("Input list:\n"); for(int i = 0;i<N;i++){ scanf("%d",&list[i]); } int maxSubSum = MaxSubSeq(list); pr原创 2021-09-18 21:34:32 · 350 阅读 · 1 评论 -
c语言删除数组中的重复元素
初始代码,可根据自己的需求进行修改#include<stdio.h>int removeDuplicates(int *nums,int numsSize);int main(){ // 初始化数组 int num[5] = {1,1,1,1,1}; int length = removeDuplicates(num,5); // 打印数组长度 printf("%d\n",length); // 遍历数组 for(int i=0;i<length;i++){ pri原创 2021-10-20 21:40:16 · 4436 阅读 · 0 评论 -
股票利益最大化(贪心算法及动态规划)
1.可以多次买卖一支股票2.不能参加多笔交易,买之前需要把之前的股票卖掉贪心算法实现原理:只要第二天比第一天的股价贵,能赚钱的就买下来,然后第二天卖掉。否则的话就不买。main函数下的代码#include<stdio.h>int maxProfit(int* prices, int pricesSize);int main(){ // 初始化一个股票价格数组 int prices[5] = {7,2,4,9,5}; int profit = maxProfit(prices,原创 2021-10-21 10:51:24 · 1397 阅读 · 0 评论 -
实现数组翻转
一、一般能想到的最简单的方法,就是每次把最后一个位置的元素暂时保存一下,然后将其余的元素忘后移动,然后将暂时保存的元素放到第一个位置,这个方法简单容易想到,但是性能不够好。时间复杂度O(n²),空间复杂度O(1)。继续更新其他方法。#include<stdio.h>void rotate(int* nums, int numsSize, int k);int main(){ // 初始化数组 int nums[7] = {1,2,3,4,5,6,7}; // 旋转的次数 int原创 2021-10-21 16:43:20 · 337 阅读 · 0 评论 -
查找数组中只出现一次的数据
题目规定只有一个数出现了一次,这个题目最容易想到的办法是通过异或运算异或运算:1、a^a=02、a^0=a3、a ^ b ^ c=a ^ c ^ b可以根据这三个规律进行异或运算,最后得出的结果就是出现一次的那个数。main函数代码,可以根据自己的需求修改#include<stdio.h>int singleNumber(int* nums, int numsSize);int main(){ int nums[5] = {4,1,2,1,2}; int number =原创 2021-10-24 21:18:29 · 361 阅读 · 0 评论 -
数组的交集
求数组中的相同元素,这是力扣上的一道题,很容易想到的方法就是,将数组进行排序,然后利用双指针法分别指向两个数组,在两个指针都不到达数组结尾的情况下,如果元素相同就将该元素放到临时数组中,两个指针分别向后移动,如果某个数组的元素小于另一个数组的元素,小的指针移动,继续判断两个元素大小,直到有一个指针到达数组末尾。时间复杂度O(nlogn)main函数下的代码#include<stdio.h>#include<malloc.h>#include<math.h>int原创 2021-10-25 18:46:01 · 226 阅读 · 0 评论 -
实现数组加一
题目来源于力扣数组中的各个元素由0-9之间的数字组成,组成一个非负整数,包括0,9。除了0之外,不会有数字以0开头。数组的首位是数字的最高位,比如{1,2,3}加一操作后变成{1,2,4},{0}加一变成{1},{9}加一变成{1,0}...原创 2021-10-26 10:51:35 · 1366 阅读 · 0 评论 -
数组零元素移动到末尾
题目来源于力扣–https://leetcode-cn.com/将数组中的零元素移动到数组末尾,非零元素相对的顺序不会被改变。 将非零元素往前移,使用两个指针,i指针,j指针,初始化指在数组首位,i所指的位置是可以被替换的位置,当j指针所指元素不为0时,将j所指位置的元素赋值给i所指的位置,i++,j++,否则为0时,i不动,j++。main函数下的代码#include<stdio.h>void moveZeroes(int* nums, int numsSize);int mai原创 2021-10-27 10:18:50 · 1716 阅读 · 0 评论 -
求解两元素之和等于给定值的两元素下标
题目来源于力扣–https://leetcode-cn.com/给定一个值,找出数组中两个元素之和等于这个值的元素下标,并以数组的形式返回,顺序可以任意,给定的值只会对应一个答案,数组的元素不能重复输出,比如{1,1},这是不可行的。一、暴力枚举两个循环,枚举直到找到与给定值相同的两个元素,时间复杂度O(n²),空间复杂度O(1)main函数下的代码#include<stdio.h>#include<malloc.h>int* twoSum(int* nums, int原创 2021-10-27 20:09:59 · 245 阅读 · 0 评论 -
实现字符串的翻转
题目来源于力扣–https://leetcode-cn.com/使用双指针法,一个指向数组末尾high,一个指向数组首位置low,交换数组元素,low++,high–,当low>=high的时候,表示这个过程已经完成。时间复杂度O(n)main函数代码#include<stdio.h>void reverseString(char* s, int sSize);int main(){ char s[5] = {'h','e','l','l','o'}; reverseStr原创 2021-10-27 22:02:28 · 88 阅读 · 0 评论 -
实现整数的翻转
题目来源于力扣–https://leetcode-cn.com/从获取整数的低位开始,然后一直到最高位,首先是取余获取最低位,然后整除再取余,依次类推,获取整数的每位数字,但是这个题要求翻转后的数字不能超过int所存储的最大数字,且要求环境不能存储64位数字,这边我是参考的,力扣的官方解析,题目解析请点击此处加上判断最后如图过程就实现了翻转:main函数代码#include<stdio.h>#include<limits.h>int reverse(int x);in原创 2021-10-29 11:54:55 · 195 阅读 · 0 评论 -
查找字符串中第一个唯一的字符
题目来源于力扣–https://leetcode-cn.com/可以用一个临时的数组来对出现的字符进行计数,题目要求,字符全都是小写的,所以我们可以给定一个26大小的数组来存放每个字符出现的次数,最后循环判断哪个地方的字符为1,就是第一个出现的唯一字符,否则返回-1。main函数代码#include<stdio.h>int firstUniqChar(char * s);int main(){ char s[]="leetcode"; int num = firstUniqCh原创 2021-10-29 21:08:18 · 222 阅读 · 0 评论 -
有效的字母异位词
题目来源于力扣–https://leetcode-cn.com/查找字符串中每个字符出现的次数,如果每个字符出现的次数是一样多的,那就返回true,否则返回false。出现的字符都是小写,因为小写字母ASCII码是数字,字符也是可以排序的,这种情况下首先判断两个字符串的长度是否一致,长度不一致,直接返回false,如果长度一致就进行快速排序,在判断每个字符串的每个位置的字符是否相等,如果相等返回true,否则返回false。main函数代码#include<stdio.h>void qu原创 2021-10-29 21:43:49 · 68 阅读 · 0 评论 -
验证回文串
题目来源于力扣–https://leetcode-cn.com/给定一个字符串,验证它是否是回文串,只考虑字母和数字字符,可以忽略字母的大小写。1、首先将字符串的字母转为小写字母。2、遇到非字母或者数字跳过3、比较字母或者数字是否相同main函数代码#include<stdio.h>bool isPalindrome(char * s);int main(){ char s[] = "A man, a plan, a canal: Panama"; bool isTrue =原创 2021-11-01 20:02:17 · 112 阅读 · 0 评论 -
字符串转换整数
题目来源于力扣–https://leetcode-cn.com/leetbook/read/top-interview-questions-easy/xnoilh/要求看上述链接的要求符号代表+,-遍历字符串,字符串一开始只能是空格,符号,或者是数字,如果不是上述的字符,直接退出循环,返回0。如果有空格,符号还要判断是不是在数字前边,不是的话就退出循环。还要判断符号出现的次数,出现两次及以上直接返回0。还要判断是否越界问题。main函数代码可以修改#include<stdio.h>原创 2021-11-06 17:50:01 · 69 阅读 · 0 评论