算法
c语言算法学习,每周至少完成两道题
胡萝卜1号
一个屎肥宅的学习笔记
展开
-
[C语言][剑指offer篇]--II. 和为s的连续正数序列 (滑动窗口)
1. 题目描述输入一个正整数 target ,输出所有和为 target 的连续正整数序列(至少含有两个数)。序列内的数字由小到大排列,不同序列按照首个数字从小到大排列。2. 理清思路 根据题意“输出所有和为target的连续正整数序列”,首先“连续正整数序列和”在数学上有求和公式,比方 l 指向连续正整数序列的首元素,r指向连续正整数序列的尾元素,由题意可知初始值 l = 1 , r = 2 ,则 l ~ r 之间的和为: sum=(l+r)∗(r−l+1)2sum=\frac{(l + r)*原创 2022-04-18 23:38:38 · 406 阅读 · 0 评论 -
[C语言][剑指offer篇]--57. 和为s的两个数字(对撞指针法)
题目描述输入一个递增排序的数组和一个数字s,在数组中查找两个数,使得它们的和正好是s。如果有多对数字的和等于s,则输出任意一对即可。理清思路 因为数组递增排序,所以用双指针,left指向数组头部,right指向数组尾部,循环遍历数组,并计算头尾和 sum = nums[left] + nums[right]:如果 s > target , 则 right – 。如果 s < target ,则 left ++ 。直到 s = targe时,退出循环,保存两个数,返回数组,over原创 2022-04-11 21:01:23 · 946 阅读 · 0 评论 -
[C语言][剑指offer篇]--II. 平衡二叉树(后序遍历 + 剪枝)
题目描述输入一棵二叉树的根节点,判断该树是不是平衡二叉树。如果某二叉树中任意节点的左右子树的深度相差不超过1,那么它就是一棵平衡二叉树。理清思路 后序遍历二叉树,由底向上返回某一子树的深度,并判断是否某一子树是否是平衡树,只要任意子树不是平衡树,则整棵数都不是平衡树:当节点的左右子树的深度差 < 2 ,则返回子树的深度,即:max(left_hight,right_hight)+1 。当节点的左右子树的深度差 > 2,则返回-1,说明不是平衡树。递归终止条件:root == NU原创 2022-04-10 20:45:44 · 1108 阅读 · 0 评论 -
[C语言][剑指offer篇]--I. 二叉树的深度(深度优先搜索)
1. 题目描述输入一棵二叉树的根节点,求该树的深度。从根节点到叶节点依次经过的节点(含根、叶节点)形成树的一条路径,最长路径的长度为树的深度。2. 理清思路 考虑到采用深度优先搜索,分别计算出左右子树的深度,最后取左右子树中最大的一个并加1即为二叉树的深度,即: 二叉树的深度 = Max(左子树的深度,右子树的深度) 3. 代码实现int getMax(int a,int b){ return a > b ? a :b;}int maxDepth(struct TreeN原创 2022-04-08 21:37:21 · 1126 阅读 · 0 评论 -
[C语言][剑指offer篇]--连续子数组的最大和(动态规划)
1.题目描述输入一个整型数组,数组中的一个或连续多个整数组成一个子数组。求所有子数组的和的最大值。要求时间复杂度为O(n)。提示:1 <= arr.length <= 10^5-100 <= arr[i] <= 100来源:力扣(LeetCode)链接:https://leetcode-cn.com/problems/lian-xu-zi-shu-zu-de-zui-da-he-lcof/著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。2.原创 2022-03-29 23:35:24 · 297 阅读 · 0 评论 -
[C语言][剑指offer篇]--链表中倒数第k个节点
题目描述输入一个链表,输出该链表中倒数第k个节点。为了符合大多数人的习惯,本题从1开始计数,即链表的尾节点是倒数第1个节点。例如,一个链表有 6 个节点,从头节点开始,它们的值依次是 1、2、3、4、5、6。这个链表的倒数第 3 个节点是值为 4 的节点。示例:给定一个链表: 1->2->3->4->5, 和 k = 2.返回链表 4->5.来源:力扣(LeetCode)链接:https://leetcode-cn.com/problems/lian-bia原创 2022-03-02 22:30:42 · 187 阅读 · 0 评论 -
[C语言][剑指offer篇]--第一个只出现一次的字符
题目描述在字符串 s 中找出第一个只出现一次的字符。如果没有,返回一个单空格。 s 只包含小写字母。理清思路 比较简单,哈希思想即可。代码实现char firstUniqChar(char* s){ int bitmap[26]; int size; int i = 0; if(s == NULL) { return ' '; } size = strlen(s); memset(bitmap,0,sizeof原创 2022-03-31 22:41:16 · 952 阅读 · 0 评论 -
[C语言][剑指offer篇]--数组中重复的数字
题目描述 在一个长度为 n 的数组 nums 里的所有数字都在 0~n-1 的范围内。数组中某些数字是重复的,但不知道有几个数字重复了,也不知道每个数字重复了几次。请找出数组中任意一个重复的数字。来源:力扣(LeetCode)链接:https://leetcode-cn.com/problems/shu-zu-zhong-zhong-fu-de-shu-zi-lcof著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。理清思路 位映射法(bitmap) nums数组中的值原创 2022-02-12 22:10:23 · 97 阅读 · 0 评论 -
[C语言][剑指offer篇]--打印从1到最大的n位数
题目描述输入数字 n,按顺序打印出从 1 到最大的 n 位十进制数。比如输入 3,则打印出 1、2、3 一直到最大的 3 位数 999。示例 1:输入: n = 1输出: [1,2,3,4,5,6,7,8,9]来源:力扣(LeetCode)链接:https://leetcode-cn.com/problems/da-yin-cong-1dao-zui-da-de-nwei-shu-lcof/著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。理清思路 n = 1 时原创 2022-02-21 21:48:48 · 426 阅读 · 0 评论 -
[C语言][剑指offer篇]--青蛙跳台阶
问题描述 一只青蛙一次可以跳上1级台阶,也可以跳上2级台阶。求该青蛙跳上一个 n 级的台阶总共有多少种跳法。答案需要取模 1e9+7(1000000007),如计算初始结果为:1000000008,请返回 1。来源:力扣(LeetCode)链接:https://leetcode-cn.com/problems/qing-wa-tiao-tai-jie-wen-ti-lcof著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。理清思路 青蛙跳台阶解法类似于斐波那契数列 ,唯一原创 2022-02-12 22:29:33 · 388 阅读 · 0 评论 -
[C语言][剑指offer篇]--顺时针打印矩阵(深度优先搜索&顺序遍历)
题目描述输入一个矩阵,按照从外向里以顺时针的顺序依次打印出每一个数字。示例 1:输入:matrix = [[1,2,3],[4,5,6],[7,8,9]]输出:[1,2,3,6,9,8,7,4,5]示例 2:输入:matrix = [[1,2,3,4],[5,6,7,8],[9,10,11,12]]输出:[1,2,3,4,8,12,11,10,9,5,6,7]来源:力扣(LeetCode)链接:https://leetcode-cn.com/problems/shun-shi-zhen-原创 2022-03-12 15:55:50 · 1660 阅读 · 0 评论 -
[C语言][剑指offer篇]--调整数组顺序使奇数位于偶数前面
题目描述 输入一个整数数组,实现一个函数来调整该数组中数字的顺序,使得所有奇数在数组的前半部分,所有偶数在数组的后半部分。示例:输入:nums = [1,2,3,4]输出:[1,3,2,4]注:[3,1,2,4] 也是正确的答案之一。来源:力扣(LeetCode)链接:https://leetcode-cn.com/problems/diao-zheng-shu-zu-shun-xu-shi-qi-shu-wei-yu-ou-shu-qian-mian-lcof/著作权归领扣网络所有。原创 2022-02-28 22:50:38 · 409 阅读 · 0 评论 -
[C语言][剑指offer篇]--合并两个排序的链表
题目描述输入两个递增排序的链表,合并这两个链表并使新链表中的节点仍然是递增排序的。示例1:输入:1->2->4, 1->3->4输出:1->1->2->3->4->4来源:力扣(LeetCode)链接:https://leetcode-cn.com/problems/he-bing-liang-ge-pai-xu-de-lian-biao-lcof/著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。理清思路 双原创 2022-02-16 22:42:11 · 109 阅读 · 0 评论 -
[C语言][剑指offer篇]--数组中出现次数超过一半的数字(Boyer-Moore 投票算法)
题目描述数组中有一个数字出现的次数超过数组长度的一半,请找出这个数字。你可以假设数组是非空的,并且给定的数组总是存在多数元素。示例 1:输入: [1, 2, 3, 2, 2, 2, 5, 4, 2]输出: 2限制:1 <= 数组长度 <= 50000来源:力扣(LeetCode)链接:https://leetcode-cn.com/problems/shu-zu-zhong-chu-xian-ci-shu-chao-guo-yi-ban-de-shu-zi-lcof著作权归原创 2022-03-17 21:53:34 · 953 阅读 · 0 评论 -
[C语言][剑指offer篇]--二叉树的镜像
题目描述请完成一个函数,输入一个二叉树,该函数输出它的镜像。例如输入:镜像输出:来源:力扣(LeetCode)链接:https://leetcode-cn.com/problems/er-cha-shu-de-jing-xiang-lcof著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。理清思路 递归法:依次改变左右节点的指针。代码实现struct TreeNode* mirrorTree(struct TreeNode* root){ if(ro原创 2022-03-07 23:10:46 · 628 阅读 · 0 评论 -
[C语言][剑指offer篇]--删除链表的节点(解读Linus大大的写法)
题目描述给定单向链表的头指针和一个要删除的节点的值,定义一个函数删除该节点。返回删除后的链表的头节点。输入: head = [4,5,1,9], val = 5输出: [4,1,9]解释: 给定你链表中值为 5 的第二个节点,那么在调用了你的函数之后,该链表应变为 4 -> 1 -> 9.来源:力扣(LeetCode)链接:https://leetcode-cn.com/problems/shan-chu-lian-biao-de-jie-dian-lcof著作权归领扣网络原创 2022-02-24 23:37:36 · 1129 阅读 · 0 评论 -
[C语言][剑指offer篇]--二进制中1的个数
题目描述编写一个函数,输入是一个无符号整数(以二进制串的形式),返回其二进制表达式中数字位数为 ‘1’ 的个数(也被称为 汉明重量).)。来源:力扣(LeetCode)链接:https://leetcode-cn.com/problems/er-jin-zhi-zhong-1de-ge-shu-lcof/著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。理清思路 运用 & 位运算和移位运算来判断输入整数的每一个二进制位是否为1。但首先需要了解实际系统是32位还是6原创 2022-02-20 21:05:05 · 546 阅读 · 0 评论 -
[C语言][剑指offer篇]--反转链表
题目描述定义一个函数,输入一个链表的头节点,反转该链表并输出反转后链表的头节点。示例:输入: 1->2->3->4->5->NULL输出: 5->4->3->2->1->NULL来源:力扣(LeetCode)链接:https://leetcode-cn.com/problems/fan-zhuan-lian-biao-lcof/著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。理清思路 双指针思想:pre原创 2022-03-03 22:33:07 · 79 阅读 · 0 评论 -
[C语言][剑指offer篇]--对称二叉树
题目描述请实现一个函数,用来判断一棵二叉树是不是对称的。如果一棵二叉树和它的镜像一样,那么它是对称的。示例 1:输入:root = [1,2,2,3,4,4,3]输出:true示例 2:输入:root = [1,2,2,null,3,null,3]输出:false来源:力扣(LeetCode)链接:https://leetcode-cn.com/problems/dui-cheng-de-er-cha-shu-lcof著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处原创 2022-03-09 22:58:56 · 119 阅读 · 0 评论 -
[C语言][剑指offer篇]--从上到下打印二叉树 II(广度优先搜索)
题目描述从上到下按层打印二叉树,同一层的节点按从左到右的顺序打印,每一层打印到一行。例如:给定二叉树: [3,9,20,null,null,15,7],提示:节点总数 <= 1000来源:力扣(LeetCode)链接:https://leetcode-cn.com/problems/cong-shang-dao-xia-da-yin-er-cha-shu-ii-lcof/著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。理清思路 广度优先搜索(BFS):B原创 2022-03-15 23:15:24 · 1287 阅读 · 0 评论 -
[C语言][剑指offer篇]--旋转数组的最小数字
题目描述把一个数组最开始的若干个元素搬到数组的末尾,我们称之为数组的旋转。给你一个可能存在 重复 元素值的数组 numbers ,它原来是一个升序排列的数组,并按上述情形进行了一次旋转。请返回旋转数组的最小元素。例如,数组 [3,4,5,1,2] 为 [1,2,3,4,5] 的一次旋转,该数组的最小值为1。来源:力扣(LeetCode)链接:https://leetcode-cn.com/problems/xuan-zhuan-shu-zu-de-zui-xiao-shu-zi-lcof著作权归原创 2022-02-12 23:05:08 · 68 阅读 · 0 评论 -
[C语言][剑指offer篇]--最小的k个数(堆排序)
1. 题目描述 输入整数数组 arr ,找出其中最小的 k 个数。例如,输入4、5、1、6、2、7、3、8这8个数字,则最小的4个数字是1、2、3、4。来源:力扣(LeetCode)链接:https://leetcode-cn.com/problems/zui-xiao-de-kge-shu-lcof/著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。2. 理清思路2.1 堆排序的基础概念2.1.2 完全二叉树 如果二叉树的深度为n,则除第n层外其余所有层节点都有2个子原创 2022-03-24 23:47:15 · 2015 阅读 · 0 评论 -
[C语言][剑指offer篇]--替换空格
题目描述请实现一个函数,把字符串 s 中的每个空格替换成"%20"。来源:力扣(LeetCode)链接:https://leetcode-cn.com/problems/ti-huan-kong-ge-lcof/著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。理清思路 利用双指针思想,第一指针遍历数组找到每个空格,并将空格替换为’\0’ ,第二指针指向源字符串的首地址,然后利用strcat将第二指针所指地址到第一个’\0’的字符串追加到目标地址中,最后,第二指针移动到第一原创 2022-02-14 23:25:11 · 521 阅读 · 0 评论 -
[C语言][剑指offer篇]--从尾到头打印链表
题目描述输入一个链表的头节点,从尾到头反过来返回每个节点的值(用数组返回)。来源:力扣(LeetCode)链接:https://leetcode-cn.com/problems/cong-wei-dao-tou-da-yin-lian-biao-lcof/著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。理清思路方法一 尾填数组法 尾填数组法是指正向遍历链表,将节点数据从数组的尾部开始填入。第一次遍历链表,计算出链表的长度sizemalloc分配size大小的内存原创 2022-02-15 22:59:20 · 618 阅读 · 0 评论 -
[C语言][剑指offer篇]--用两个栈实现队列
题目描述 用两个栈实现一个队列。队列的声明如下,请实现它的两个函数 appendTail 和 deleteHead ,分别完成在队列尾部插入整数和在队列头部删除整数的功能。(若队列中没有元素,deleteHead 操作返回 -1 )来源:力扣(LeetCode)链接:https://leetcode-cn.com/problems/yong-liang-ge-zhan-shi-xian-dui-lie-lcof著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。理清思路 原则原创 2022-02-12 13:20:45 · 117 阅读 · 0 评论 -
[C语言][剑指offer篇]--二叉搜索树的第k大节点(中序遍历)
1. 题目描述给定一棵二叉搜索树,请找出其中第 k 大的节点的值。2. 理清思路2.1 二叉搜索树 二叉搜索树是一种节点值之间具有一定数量级次序的二叉树,时间复杂度O(log2n) ~ O(logn),对于每个节点有:若其有左子树,则左子树中的节点都不大于该节点。若其有右子树,则右子树中的节点都不小于该节点。二叉搜索树的中序遍历是递减序列或递增序列。例如:2.2 中序遍历 若树为空,则空操作返回,否则从根节点开始(注意不是先访问根节点),中序遍历根节点的左子树,然后访问根节点,最原创 2022-04-07 23:30:53 · 1188 阅读 · 0 评论 -
[C语言][剑指offer篇]--II. 0~n-1中缺失的数字(二分法)
题目描述一个长度为n-1的递增排序数组中的所有数字都是唯一的,并且每个数字都在范围0~n-1之内。在范围0~n-1内的n个数字中有且只有一个数字不在该数组中,请找出这个数字。来源:力扣(LeetCode)链接:https://leetcode-cn.com/problems/que-shi-de-shu-zi-lcof著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。理清思路 排序数组的查找一般采用二分法。考虑左子数组有 nums[left] = left , 右子数组有原创 2022-04-06 23:26:36 · 116 阅读 · 0 评论 -
[C语言][剑指offer篇]--在排序数组中查找数字 I (二分查找)
题目描述统计一个数字在排序数组中出现的次数。理清思路 遍历数组,用一个计数count记录数组中出现target的次数,最后返回count,时间复杂度为O(n)。但是这个方法没有利用到题目中 “排序数组”的条件。所以此题采用二分查找方法符合题意,且时间复杂度为O(log(n)),分别找到数组中第一个target的下标和数组中最后一个target的下标,最后两个下标相减再加1便是target在数组中出现的次数。此题二分查找的关键点在于查找两个下标的位置,具体做法如下:单独编写一个查找下标的函数 fi原创 2022-04-02 17:53:05 · 1153 阅读 · 0 评论 -
[C语言][剑指offer篇]--两个链表的第一个公共节点
题目描述输入两个链表,找出它们的第一个公共节点。理清思路双指针定义ptrA指向headA,ptrB指向headB。首先判断特殊情况,只要其中一个链表为空,则永远不会相交,返回BULL。分别遍历链表,当ptrA走到尾时,指向headB,同时ptrB走到尾时,指向headA。只有当ptrA 等于 ptrB时才退出循环,返回ptrA。代码实现双指针struct ListNode *getIntersectionNode(struct ListNode *headA, struct List原创 2022-04-01 21:50:31 · 1473 阅读 · 0 评论