算法刷题
bfsm
这个作者很懒,什么都没留下…
展开
-
78. 子集
第一次尝试 给你一个整数数组 nums ,数组中的元素 互不相同 。返回该数组所有可能的子集(幂集)。解集 不能 包含重复的子集。你可以按 任意顺序 返回解集。LeetCode链接方法:记原序列中元素的总数为 n。原序列中的每个数字 ai 的状态可能有两种,即 [在子集] 和 [不在子集中]。我们用 1 表示 [在子集中],0 表示不在子集中,那么每一个子集可以对应一个长度为 n 的 0 / 1 序列,第 i 位表示 ai 是否在子集中。int** subsets(int* nums, int原创 2021-03-01 18:37:30 · 186 阅读 · 0 评论 -
150. 逆波兰表达式求值
第一次尝试 根据逆波兰表示法,求表达式的值。有效的运算符包括 +, -, *, / 。每个运算对象可以是整数,也可以是另一个逆波兰表达式。说明:整数除法只保留整数部分;给定逆波兰表达式总是有效的。换句话说,表达式总会得出有效数值且不存在除数为 0 的情况。LeetCode链接方法:使用栈来解决,创建一个栈 stack,遍历给定字符数组,遇到的是数字则入栈,遇到的是符号,则从栈中取出两个数字,来进行运算,最终返回栈顶元素即可;//判断是数字还是符号bool func(char* c){原创 2021-03-01 15:16:03 · 121 阅读 · 0 评论 -
581. 最短无序连续子数组
第一次尝试 给你一个整数数组 nums ,你需要找出一个 连续子数组 ,如果对这个子数组进行升序排序,那么整个数组都会变为升序排序。请你找出符合题意的 最短 子数组,并输出它的长度。LeetCode链接方法:首先从左向右找第一个当前位置大于后一个位置的下标 begin,从右向左找第一个当前位置小于前一个位置的下标 end,然后从 [begin,end] 这段区间内,找到最大值的下标 max 和最小值的下标 min,最后从 begin 开始向前找大于最小值的数,从 end 向后找小于最大值的数,找到之原创 2021-03-01 13:39:30 · 115 阅读 · 0 评论 -
443. 压缩字符串
第一次尝试 给定一组字符,使用原地算法将其压缩。压缩后的长度必须始终小于或等于原数组长度。数组的每个元素应该是长度为1 的字符(不是 int 整数类型)。在完成原地修改输入数组后,返回数组的新长度。LeetCode链接方法:双指针法,设置指针 idx、i,从数组首元素开始遍历,当第 i 个和第 i + 1 个元素相同时,就用 num 累加计数,如果不相同时,就将 第 i 个元素赋给 idx 位置,将 num 赋给 idx 加一的位置,然后更新变量;需要注意的是,num 如果大于 9,那么需要将其分开原创 2021-02-26 15:22:31 · 131 阅读 · 0 评论 -
125. 验证回文串
第一次尝试 给定一个字符串,验证它是否是回文串,只考虑字母和数字字符,可以忽略字母的大小写。说明:本题中,我们将空字符串定义为有效的回文串。LeetCode链接方法:双指针法,设置指针 begin、end,分别指向字符串的起始和末尾,然后循环遍历字符串,当两个指针都指向的是字母或数字时,比较二者是否相同,如果相同则继续比较,如果不相同则返回 false;//判断当前字符是否为数字或者字母bool judge(char c){ if((c > 47 && c <原创 2021-02-26 12:28:10 · 122 阅读 · 0 评论 -
34. 在排序数组中查找元素的第一个和最后一个位置
第一次尝试 给定一个按照升序排列的整数数组 nums,和一个目标值 target。找出给定目标值在数组中的开始位置和结束位置。如果数组中不存在目标值 target,返回 [-1, -1]。LeetCode链接方法:二分查法,先申请返回数组的空间,并全初始化为 -1,使用二分查找遍历数组,找到等于 target 值的下标;然后再从此位置向前向后查找,直到值不等于 target 或者出界为止,最终返回数组;int* searchRange(int* nums, int numsSize, int t原创 2021-02-25 16:33:18 · 136 阅读 · 0 评论 -
8. 字符串转换整数 (atoi)
第一次尝试 请你来实现一个 myAtoi(string s) 函数,使其能将字符串转换成一个 32 位有符号整数(类似 C/C++ 中的 atoi 函数)。LeetCode链接方法:设置符号位 ch,数值位 num,标记位 flag = 0,然后遍历字符串,一开始时遇到空格跳过,遇到非数字、非符号的字符直接返回,之后遇到符号则 flag++,遇到数字则进行运算,且 flag++,遇到非数字的则直接跳出循环;最后对结果进行判断,如果是正数,且 num >= 0x7fffffff,那么直接返回原创 2021-02-25 13:44:30 · 178 阅读 · 0 评论 -
67. 二进制求和
第一次尝试 给你两个二进制字符串,返回它们的和(用二进制表示)。输入为 非空 字符串且只包含数字 1 和 0。LeetCode链接方法:申请一个比最长字符串空间还要长一个的空间 ret,最后一个字符放上 ‘\0’,设置进位变量 num 等于 0,然后从两个字符串的末尾开始相加并加上 num,如果结果小于 2,则直接写入 ret 中,并将 num 置为 0;如果等于 2,则在 ret 中写入 ‘0’,并将 num 置为 1,;如果大于 2,则写入 ‘1’,并将 num 置为 1;照此循环下去,直到两个原创 2021-02-24 17:14:02 · 124 阅读 · 0 评论 -
1. 两数之和
第一次尝试 给定一个整数数组 nums 和一个整数目标值 target,请你在该数组中找出 和为目标值 的那 两个 整数,并返回它们的数组下标。你可以假设每种输入只会对应一个答案。但是,数组中同一个元素不能使用两遍。你可以按任意顺序返回答案。LeetCode链接方法:本题使用了暴力穷举法,就是枚举数组中的每一个数 x,寻找数组中是否存在 target - x,这种方法最为简单,但是效率不高,最好的方法应该为使用哈希表解决,但是本人还不是很会哈希表,所以以后会进行改进的;int* twoSum(i原创 2021-02-24 12:48:44 · 80 阅读 · 0 评论 -
414. 第三大的数
第一次尝试 给你一个非空数组,返回此数组中 第三大的数 。如果不存在,则返回数组中最大的数。LeetCode链接方法:用三个变量来存放第一大,第二大,第三大的元素的变量,分别为max,mid,min;然后遍历数组,若该元素比 max 大则往后顺移一个元素,比 mid 大则往往后顺移一个元素,比 min 大则赋值给 min;最后得到第三大的元素,若没有则返回第一大的元素。由于此处用到比int类型最小值还要小的值,本人不知道写什么好,所以就没完成,只要将其改动,代码就是完整的,思路也是正确的;#d原创 2021-02-23 21:24:39 · 103 阅读 · 0 评论 -
66. 加一
第一次尝试 给定一个由 整数 组成的 非空 数组所表示的非负整数,在该数的基础上加一。最高位数字存放在数组的首位, 数组中每个元素只存储单个数字。你可以假设除了整数 0 之外,这个整数不会以零开头。LeetCode链接方法:数组的最后一个数和 1 相加,然后判断结果是否进位,如果进位则将得到的结果的个位放回数组,将十位继续和前一个数相加,再次进行判断;如果没有进位,那么将结果放入数组,然后直接返回结果即可;int* plusOne(int* digits, int digitsSize, int原创 2021-02-23 16:36:51 · 124 阅读 · 0 评论 -
724. 寻找数组的中心索引
第一次尝试 给你一个整数数组 nums,请编写一个能够返回数组 “中心索引” 的方法。数组 中心索引 是数组的一个索引,其左侧所有元素相加的和等于右侧所有元素相加的和。如果数组不存在中心索引,返回 -1 。如果数组有多个中心索引,应该返回最靠近左边的那一个。注意:中心索引可能出现在数组的两端。LeetCode链接方法:由题意可以知道,如果数组满足题意,那么存在某个数 nums[i],左边的数之和等于右边的数之和,所以左边之和的二倍加上 nums[i] 就等于数组总和,返回 i 即可,否则返回 -1;原创 2021-02-23 14:35:55 · 105 阅读 · 0 评论 -
905. 按奇偶排序数组
第一次尝试 给定一个非负整数数组 A,返回一个数组,在该数组中, A 的所有偶数元素之后跟着所有奇数元素。你可以返回满足此条件的任何数组作为答案。LeetCode链接方法:双指针法,设置指针 begin、end,分别从数组头尾开始,begin 向后遍历找到一个奇数,end 向前遍历找到一个偶数,然后二者交换,直到 begin 不小于 end 为止;int* sortArrayByParity(int* A, int ASize, int* returnSize){ *returnSize原创 2021-02-23 11:31:41 · 170 阅读 · 0 评论 -
917. 仅仅反转字母
第一次尝试 给定一个字符串 S,返回 “反转后的” 字符串,其中不是字母的字符都保留在原地,而所有字母的位置发生反转。LeetCode链接方法:双指针法,begin 从前向后,end 从后向前,如果两个都是字母,那么交换,如果某一个不是字母,那么就向下遍历,直到二者相遇位置;//判断是否为字母bool fun(char* begin){ if((*begin > 64 && *begin < 91) || (*begin > 96 &&原创 2021-02-22 16:49:04 · 108 阅读 · 1 评论 -
977. 有序数组的平方
第一次尝试 给你一个按 非递减顺序 排序的整数数组 nums,返回每个数字的平方组成的新数组,要求也按非递减顺序排序。LeetCode链接方法:双指针法,设置两个下标 m、n,分别从 nums 数组的起始和结束位置开始遍历,比较出绝对值大的数,将其的平方放入新的数组末尾 count 处,然后更新变量;int* sortedSquares(int* nums, int numsSize, int* returnSize){ //创建一个新数组 int* ret = (int*)mallo原创 2021-02-22 16:23:19 · 76 阅读 · 0 评论 -
925. 长按键入
第一次尝试 你的朋友正在使用键盘输入他的名字 name。偶尔,在键入字符 c 时,按键可能会被长按,而字符可能被输入 1 次或多次。你将会检查键盘输入的字符 typed。如果它对应的可能是你的朋友的名字(其中一些字符可能被长按),那么就返回 True。LeetCode链接方法:字符串 typed 的每个字符,有且只有两种「用途」:作为 name 的一部分,此时会匹配 name 中的每一个字符;作为长按键入的一部分,此时它应当与前一个字符相同;双指针法:所以只需要对两个单词逐个字母进行原创 2021-02-22 14:32:07 · 99 阅读 · 0 评论 -
217. 存在重复元素
第一次尝试 给定一个整数数组,判断是否存在重复元素。如果存在一值在数组中出现至少两次,函数返回 true。如果数组中每个元素都不相同,则返回 false。LeetCode链接方法:先排序,在查找,利用希尔排序法,对数组元素进行排序,再对排序好的数组进行遍历,如果相邻两个数相等,那么返回 true,遍历结束后若仍没有相等元素,则返回 false;bool containsDuplicate(int* nums, int numsSize){ //希尔排序 int group = nums原创 2021-02-22 11:55:38 · 87 阅读 · 0 评论 -
58. 最后一个单词的长度
第一次尝试 给你一个字符串 s,由若干单词组成,单词之间用空格隔开。返回字符串中最后一个单词的长度。如果不存在最后一个单词,请返回 0 。单词是指仅由字母组成、不包含任何空格字符的最大子字符串。LeetCode链接方法:设置指针 m、n 都指向字符串开始,然后 m 指针向后遍历,遇到当前是空格且下一个是字符的位置,令 n 指向该位置,然后 m 继续向后遍历,重复循环此过程,直到 m 走到结束时,n 正好指向最后一个单词的起始位置,然后再循环遍历得到数目;int lengthOfLastWord(原创 2021-02-20 15:28:17 · 92 阅读 · 0 评论 -
9. 回文数
第一次尝试 给你一个整数 x ,如果 x 是一个回文整数,返回 true ;否则,返回 false 。回文数是指正序(从左向右)和倒序(从右向左)读都是一样的整数。例如,121 是回文,而 123 不是。LeetCode链接方法:递归法,令 val 等于 x,保留数字,将数字 x 的个位取出,然后将数字 x 除以 10,直到数字等于零为止,此时开始往回递归,用每一次得到的个位数字,和 val 的个位比较,然后将 val 除以 10,如果比较结果相等,则返回 true,继续往回递归,如果比较的结果不原创 2021-02-20 14:02:13 · 325 阅读 · 1 评论 -
383. 赎金信
第一次尝试 给定一个赎金信 (ransom) 字符串和一个杂志(magazine)字符串,判断第一个字符串 ransom 能不能由第二个字符串 magazines 里面的字符构成。如果可以构成,返回 true ;否则返回 false。(题目说明:为了不暴露赎金信字迹,要从杂志上搜索各个需要的字母,组成单词来表达意思。杂志字符串中的每个字符只能在赎金信字符串中使用一次)。LeetCode链接方法:计数法,题目的意思是,赎金信中出现的字符在杂志重要出现,且一对一就返回 true,否则就返回 false;原创 2021-02-19 19:15:09 · 127 阅读 · 0 评论 -
35. 搜索插入位置
第一次尝试 给定一个排序数组和一个目标值,在数组中找到目标值,并返回其索引。如果目标值不存在于数组中,返回它将会被按顺序插入的位置。你可以假设数组中无重复元素。LeetCode链接方法:简单计数,找到第一个大于等于待插入数据的元素,然后该位置就是要返回的位置;如果循环结束没找到,那么最后一个位置后面的位置就是要返回的;int searchInsert(int* nums, int numsSize, int target){ int i = 0; //循环找位置 whil原创 2021-02-19 14:24:58 · 114 阅读 · 0 评论 -
189. 旋转数组
第一次尝试 给定一个数组,将数组中的元素向右移动 k 个位置,其中 k 是非负数。LeetCode链接方法一:交换法,最简单的方法就是从数组的最后一个位置(numsSize)的元素开始,将 nums[numsSize] 拿出保存,其余元素向后移动,再将 nums[numsSize] 放到第一个位置,这样移动k次即可完成右旋 k 次,不过这样做很繁琐,我么可以化简步骤,先将前面的 numsSize - k 个元素倒置,再将后面的 k 个元素倒置,最后将整个数组倒置,这样就可以完成右旋 k 次;方法二原创 2021-02-16 18:32:20 · 85 阅读 · 0 评论 -
709. 转换成小写字母
第一次尝试 实现函数 ToLowerCase(),该函数接收一个字符串参数 str,并将该字符串中的大写字母转换成小写字母,之后返回新的字符串。LeetCode链接方法:创建地图进行比较,其实我们可以不创建地图来进行,直接使用 ascll 码表的值来进行,如果字符在大写字符范围内,那么就将其变成对应的小写,也就是加上 32,但是这样做有一个风险,那就是如果某天 ascll 码表变化了,那该怎么办呢(当然这个问题很难发生,但是不排除可能性)?因此,像这种代码,我们可以自己制作一个简单的地图,来存放需原创 2021-02-16 17:18:58 · 106 阅读 · 0 评论 -
145. 二叉树的后序遍历
第一次尝试原创 2021-01-20 14:58:34 · 94 阅读 · 0 评论 -
94. 二叉树的中序遍历
第一次尝试原创 2021-01-20 11:27:39 · 97 阅读 · 0 评论 -
144. 二叉树的前序遍历
第一次尝试原创 2021-01-19 21:30:02 · 129 阅读 · 0 评论 -
102. 二叉树的层序遍历
123原创 2021-01-19 18:54:52 · 98 阅读 · 0 评论 -
110. 平衡二叉树
第一次尝试 给定一个二叉树,判断它是否是高度平衡的二叉树。本题中,一棵高度平衡二叉树定义为:一个二叉树每个节点 的左右两个子树的高度差的绝对值不超过 1 。LeetCode链接方法:递归法,本题让判断一棵树是否为平衡二叉树,那么就要判断以该二叉树每个节点为根的二叉树是否平衡,如果平衡,那么就返回 true,如果有一个不满足,那么就返回 false; 而判断一个树是否平衡,那就看它的左右子树的深度之差的绝对值是否小于 2 即可,所以我们使用递归法,来遍历每一个节点,在遍历的过程中,计算每个节点左右原创 2021-01-19 10:44:09 · 137 阅读 · 0 评论 -
572. 另一个树的子树
第一次尝试 给定两个非空二叉树 s 和 t,检验 s 中是否包含和 t 具有相同结构和节点值的子树。s 的一个子树包括 s 的一个节点和这个节点的所有子孙。s 也可以看做它自身的一棵子树。(此处对于子树的要求十分严格,在 s 中出现的 t 必须一模一样,不能少,也不能多)LeetCode链接方法:递归法,本题和我之前博客写过的一道题十分类似(100.相同的树),本题在该题的基础上做了提升,让判断 t 树是否为 s 树的子树,那么只需从 s 树的根结点开始遍历,分别与 t 树作比较,如果是相同的树,那原创 2021-01-18 20:47:29 · 75 阅读 · 0 评论 -
101. 对称二叉树
第一次尝试 给定一个二叉树,检查它是否是镜像对称的。LeetCode链接方法:递归法,在该题中,判断镜像就是在同一深度处,对称的两个结点 a、b,数据相同,并且 a 的左孩子和 b 的右孩子相同,a 的右孩子和 b 的左孩子相同;从上至下,依次做出这样的判断,递归的结束条件为,如果两个结点都走到了空,那么返回 true,若果两个节点中的一个走到了空,那么返回 false;//用来递归深入的判断的bool _isSymmetric(struct TreeNode* _left, struct T原创 2021-01-18 20:08:34 · 67 阅读 · 0 评论 -
100. 相同的树
第一次尝试 给定两个二叉树,编写一个函数来检验它们是否相同。如果两个树在结构上相同,并且节点具有相同的值,则认为它们是相同的。LeetCode链接方法:递归法,判断两颗树是否相同,首先结点元素相同,其次链接结构相同,要同时判断这两点,那就从两棵树的根开始,以同一种遍历方式开始递归遍历,并且比较每个节点的元素数据是否相同,如果出现不同的,就返回false; 递归的结束条件就是二者都走到空,此时返回 true,或者是二者其中之一走到空,此时返回 false。bool isSameTree(str原创 2021-01-18 18:26:10 · 98 阅读 · 0 评论 -
226. 翻转二叉树
第一次尝试 翻转一棵二叉树,使翻转前的二叉树和翻转后的二叉树呈镜相对称,如下图展示。LeetCode链接方法:递归法,从上至下,将每个节点的左右子树交换,即可完成,相当于完成了一次前序遍历,只不过不是执行打印操作,而是交换左右子树操作。struct TreeNode* invertTree(struct TreeNode* root){ //参数合法性检验,也是递归的结束条件 if(root == NULL){ return NULL; } //原创 2021-01-18 17:54:38 · 95 阅读 · 0 评论 -
104. 二叉树的最大深度
第一次尝试 给定一个二叉树,找出其最大深度。二叉树的深度为根节点到最远叶子节点的最长路径上的节点数。LeetCode链接方法:递归法,在前面我的创建二叉树博客中写到过这样几个接口,求二叉树中叶子结点的个数,求二叉树结点个数等等,这些接口的实现思路就是根结点加上左右子树的,就是总的个数,那么这道题也是这样的思路,不过,需要注意的是要求的是最大深度,所以取左右子树中最大的那一个即可。int maxDepth(struct TreeNode* root){ //参数合法性检验,也是递归函数的结原创 2021-01-18 15:17:51 · 70 阅读 · 0 评论 -
965. 单值二叉树
如果二叉树每个节点都具有相同的值,那么该二叉树就是单值二叉树。只有给定的树是单值二叉树时,才返回 true;否则返回 false。LeetCode链接方法:原创 2021-01-18 11:37:26 · 115 阅读 · 0 评论 -
剑指 Offer 31. 栈的压入、弹出序列
第一次尝试 输入两个整数序列,第一个序列表示栈的压入顺序,请判断第二个序列是否为该栈的弹出顺序。假设压入栈的所有数字均不相等。例如,序列 {1,2,3,4,5} 是某栈的压栈序列,序列 {4,5,3,2,1} 是该压栈序列对应的一个弹出序列,但 {4,3,5,1,2} 就不可能是该压栈序列的弹出序列。LeetCode链接方法:...原创 2021-01-03 08:47:54 · 351 阅读 · 0 评论 -
622. 设计循环队列
第一次尝试 设计你的循环队列实现。 循环队列是一种线性数据结构,其操作表现基于 FIFO(先进先出)原则并且队尾被连接在队首之后以形成一个循环。它也被称为“环形缓冲器”。 循环队列的一个好处是我们可以利用这个队列之前用过的空间。在一个普通队列里,一旦一个队列满了,我们就不能插入下一个元素,即使在队列前面仍有空间。但是使用循环队列,我们能使用这些空间去存储新的值。LeetCode链接方法:在真实的系统中,是不存在循环的内存的,这里所说的循环指的是在逻辑上循环,在物理上实现循环的特点,这里我用两种原创 2021-01-03 08:47:30 · 199 阅读 · 0 评论 -
20. 有效的括号
第一次尝试给定一个只包括 (,),{,},[,] 的字符串,判断字符串是否有效。有效字符串需满足:左括号必须用相同类型的右括号闭合。左括号必须以正确的顺序闭合。注意空字符串可被认为是有效字符串。LeetCode链接方法:...原创 2021-01-03 08:47:21 · 87 阅读 · 0 评论 -
225. 用队列实现栈
第一次尝试使用队列实现栈的下列操作:push(x) – 元素 x 入栈pop() – 移除栈顶元素top() – 获取栈顶元素empty() – 返回栈是否为空LeetCode链接方法:利用栈和队列的特点,栈是先进后出,所以用队列来实现的话,入栈就直接入队即可,出栈时弹出栈顶元素,此时队列的队尾元素才是栈顶,所以使用循环出队入队才能得到队尾元素,出队一个元素然后进入队尾,直到拿到栈顶元素即可;所以利用队列来实现栈只需一个队列即可,利用循环出队入队即可完成操作。//使用这种方式来重命名原创 2021-01-02 09:19:20 · 89 阅读 · 0 评论 -
232. 用栈实现队列
第一次尝试 请你仅使用两个栈实现先入先出队列。队列应当支持一般队列的支持的所有操作(push、pop、peek、empty):实现 MyQueue 类:1.void push(int x) 将元素 x 推到队列的末尾2.int pop() 从队列的开头移除并返回元素3.int peek() 返回队列开头的元素4.boolean empty() 如果队列为空,返回 true ;否则,返回 falseLeetCode链接方法:双栈法,创建两个栈,一个入队栈,一个出队栈,因为队列是先进先出原创 2021-01-02 09:19:09 · 85 阅读 · 1 评论 -
82. 删除排序链表中的重复元素 II(不保留重复的)
第一次尝试 给定一个排序链表,删除所有含有重复数字的节点,只保留原始链表中没有重复出现的数字。链表为无头结点、单向、不循环。(由于涉及到结构体,所以写不了完整的测试代码,下面展示的代码为LeetCode中写的代码)(LeetCode链接)方法一:迭代法,由于头结点处重复和其他地方重复的操作不一样,所以我们先设置一个虚头结点,然后设置三个节点:flag、start、end,flag 从虚头结点开始,start 从第一个节点开始,end 从第二个元素开始,如果 start->val == end-原创 2021-01-01 21:05:58 · 210 阅读 · 0 评论