- 博客(102)
- 收藏
- 关注
原创 搜索插入位置
给定一个排序数组和一个目标值,在数组中找到目标值,并返回其索引。如果目标值不存在于数组中,返回它将会被按顺序插入的位置。由于该题指定算法时间复杂度 为O(log n),则该题的解题思路可以利用二分法来进行求解。输入: nums = [1,3,5,6], target = 5。输入: nums = [1,3,5,6], target = 2。输入: nums = [1,3,5,6], target = 7。另外,二分法,一定要注意区间范围,否则容易出现边界错误。
2023-08-11 14:44:11
333
原创 字符串的排列
输出:[“abc”,“acb”,“bac”,“bca”,“cab”,“cba”]进行深度优先搜索,但是要注意可能会有重复的字符,所以要适当的进行“剪枝”。你可以以任意顺序返回这个字符串数组,但里面不能有重复元素。输入一个字符串,打印出该字符串中字符的所有排列。输入:s = “abc”
2023-07-31 16:02:00
260
原创 把数字翻译成字符串
给定一个数字,我们按照如下规则把它翻译为字符串:0 翻译成 “a” ,1 翻译成 “b”,……,11 翻译成 “l”,……,25 翻译成 “z”。请编程实现一个函数,用来计算一个数字有多少种不同的翻译方法。解释: 12258有5种不同的翻译,分别是"bccfi", “bwfi”, “bczi”, “mcfi"和"mzi”该题可以采用动态规划的思想,以25和10为分界点,进行判断,然后依次递归进行动态数组的更新。方法二是数学方法,进行规律的分析查找,这个方法不是很好想,这是在网上看的大佬解题。
2023-07-31 15:17:51
305
原创 从上到下打印二叉树
建立一个vector数组ret用来当做返回的结果数组,建立一个队列用来接收二叉树的内容,当队列不为空时,取出队列的队头元素temp,将其val数值压入结果数组中,然后再将该队列队头元素弹出,最后依次访问temp的左右子树,若不为空,压入队列中,进行下一步的判断和结果数组的压入。从上到下打印出二叉树的每个节点,同一层的节点按照从左到右的顺序打印。给定二叉树: [3,9,20,null,null,15,7],
2023-07-27 11:21:05
200
原创 丑数的求解
初始分别指向三个有序链表第一个元素,这三个有序链表分别就是ret数组元素分别乘以2,3,5得到的,要注意一点,这三个序列中可能有重复的元素,要进行去重的操作,最后返回结果数组ret即可。我们把只包含质因子 2、3 和 5 的数称作丑数(Ugly Number)。求按从小到大的顺序的第 n 个丑数。由题意可知一个丑数可以通过另一个丑数 * 2 3 5得到,每个丑数*2 3 5 后可以看成是一个递增数组;解释: 1, 2, 3, 4, 5, 6, 8, 9, 10, 12 是前 10 个丑数。
2023-07-27 10:56:41
256
原创 数组中仅出现一次的数字
然后遍历该数组,增量为3,若当前元素和其下一位置的元素不相同,则此时该值便是要查找的值,若遍历结束后无匹配的值,则说明该值为最大值,排列在最后,返回其值即可。利用map容器的键值对一一对应关系,进行数组的遍历,first存储数组中出现的数字,second表示该数在数组中出现的次数。请找出那个只出现一次的数字。最后进行map容器的遍历,其second值为1的元素即为要查找的值,输出其first即可。输入:nums = [9,1,7,9,7,9,7]输入:nums = [3,4,3,3]
2023-07-13 17:20:31
403
原创 扑克牌中的顺子
从若干副扑克牌中随机抽 5 张牌,判断是不是一个顺子,即这5张牌是不是连续的。2~10为数字本身,A为1,J为11,Q为12,K为13,而大、小王为 0 ,可以看成任意数字。A 不能视为 14。若该序列中数据中断的次数小于0的个数,此时说明0的个数够用,也就是说此时是顺子,返回为真;若0的个数不够用的,则此时说明该序列不是顺子,返回为假。先将数据进行从小到大的排序,将其变成一个有序的序列。输入: [1,2,3,4,5]输入: [0,0,1,2,5]
2023-07-13 16:26:12
237
原创 平衡二叉树
输入一棵二叉树的根节点,判断该树是不是平衡二叉树。如果某二叉树中任意节点的左右子树的深度相差不超过1,那么它就是一棵平衡二叉树。给定二叉树 [1,2,2,3,3,null,null,4,4]二、此时有左右子树,求出左子树和右子树的高度,进行判断即可。给定二叉树 [3,9,20,null,null,15,7]一、无左右子树,只有一个顶点结点,则此时为平衡二叉树。返回 false。
2023-07-13 14:45:50
181
原创 圆圈中最后剩下的数字
0,1,···,n-1这n个数字排成一个圆圈,从数字0开始,每次从这个圆圈里删除第m个数字(删除后从下一个数字开始计数)。求出这个圆圈里剩下的最后一个数字。例如,0、1、2、3、4这5个数字组成一个圆圈,从数字0开始每次删除第3个数字,则删除的前4个数字依次是2、0、4、1,因此最后剩下的数字是3。可以利用动态数组将数据压入该动态数组中,然后依次删除指定位置的数值。方法二是从最后反推之前的,最后一轮肯定只有两个数据,依次向前推。输入: n = 10, m = 17。输入: n = 5, m = 3。
2023-07-13 14:14:12
140
原创 二叉树的最近公共祖先
百度百科中最近公共祖先的定义为:“对于有根树 T 的两个结点 p、q,最近公共祖先表示为一个结点 x,满足 x 是 p、q 的祖先且 x 的深度尽可能大(一个节点也可以是它自己的祖先)。输入: root = [3,5,1,6,2,0,8,null,null,7,4], p = 5, q = 1。输入: root = [3,5,1,6,2,0,8,null,null,7,4], p = 5, q = 4。例如,给定如下二叉树: root = [3,5,1,6,2,0,8,null,null,7,4]
2023-07-11 20:03:59
278
原创 和为s的两个数字
输入一个递增排序的数组和一个数字s,在数组中查找两个数,使得它们的和正好是s。因为数组有序,可以使用二分法对数组进行查找,相关算法思想和方法一类似,并且时间复杂度也比较低。输入:nums = [10,26,30,31,47,60], target = 40。若前后指针指向的值和为指定值则返回这对数,若小于指定值则前指针后移,反之后指针前移。输入:nums = [2,7,11,15], target = 9。输出:[10,30] 或者 [30,10]输出:[2,7] 或者 [7,2]
2023-07-10 21:08:53
361
原创 两个链表的第一个公共节点
从各自的表头开始算起,链表 A 为 [4,1,8,4,5],链表 B 为 [5,0,1,8,4,5]。输入解释:相交节点的值为 2 (注意,如果两个列表相交则不能为 0)。输入:intersectVal = 8, listA = [4,1,8,4,5], listB = [5,0,1,8,4,5], skipA = 2, skipB = 3。输入:intersectVal = 2, listA = [0,9,1,2,4], listB = [3,2,4], skipA = 3, skipB = 1。
2023-06-27 17:18:00
442
原创 翻转单词顺序
输入一个英文句子,翻转句子中单词的顺序,但单词内字符的顺序不变。例如输入字符串"I am a student. “,则输出"student. a am I”。方法一:利用栈的先进后出特性,将字符依次压入栈中,再依次弹出,此时便能实现题目要求。解释: 输入字符串可以在前面或者后面包含多余的空格,但是反转后的字符不能包括。解释: 如果两个单词间有多余的空格,将反转后单词间的空格减少到只含一个。输入: “a good example”输入: “the sky is blue”输出: “world!
2023-06-27 10:41:53
322
原创 和为S的连续正数序列
如果是3个连续的数组,那么三个数之间相差为1、2,(target - 1 - 2) % 3 == 0。如果有两个连续的数之和等于target,那么相差为1, (target - 1) % 2 == 0。且数组一定是从 (target - 1 - 2) / 3开始的,数组元素是3个.且数组一定是从 (target - 1) / 2开始的,数组的元素就是2个;输出:[[1,2,3,4,5],[4,5,6],[7,8]]输出:[[2,3,4],[4,5]]输入:target = 15。
2023-06-19 15:57:06
163
原创 数组奇偶排序
定义一个新的vector容器ret用来进行原数组的筛选插入,一次遍历两次原数组,首先将奇数压到ret中,然后再将偶数压入ret中,最后返回ret即可。输入一个整数数组,实现一个函数来调整该数组中数字的顺序,使得所有奇数在数组的前半部分,所有偶数在数组的后半部分。注:[3,1,2,4] 也是正确的答案之一。输入:nums = [1,2,3,4]输出:[1,3,2,4]
2023-06-19 14:57:13
154
原创 设计模式之观察者模式
在GOF的《设计模式:可复用面向对象软件的基础》一书中对观察者模式是这样说的:定义对象间的一种一对多的依赖关系,当一个对象的状态发生改变时,所有依赖于它的对象都得到通知并被自动更新。Observer 模式要解决的问题为: 建立一个一( Subject)对多( Observer) 的依赖关系, 并且做到当“一” 变化的时候, 依赖这个“一”的多也能够同步改变。2.当对一个对象的改变需要同时改变其它对象,而不知道具体有多少对象有待改变;——当它的状态发生改变时,向它的各个观察者发出通知。
2023-06-11 17:56:06
1113
原创 对称的二叉树
请实现一个函数,用来判断一棵二叉树是不是对称的。如果一棵二叉树和它的镜像一样,那么它是对称的。只有左左和右右镜像且左右和右左镜像的时候,我们才能说这两棵树是镜像的。输入:root = [1,2,2,null,3,null,3]例如,二叉树 [1,2,2,3,4,4,3] 是对称的。输入:root = [1,2,2,3,4,4,3]当左子树和右子树完全相等时,为对称二叉树;若树只有一个根节点,则此时为对称二叉树;只要有一项不满足,则不是对称二叉树。
2023-06-06 22:21:13
123
原创 第一个错误的版本
当start 和end 都是int,两个值的初始值都超过int限定大小的一半,那么start +end 就会发生溢出,所以应该用start +(end -start )/2来防止求中值时候的溢出。不幸的是,你的产品的最新版本没有通过质量检测。由于每个版本都是基于之前的版本开发的,所以错误的版本之后的所有版本都是错的。, n],你想找出导致之后所有版本出错的第一个错误的版本。这个题目,返回 start 或者 end 都行,因为终止条件是 start == end.输入:n = 1, bad = 1。
2023-06-05 23:06:36
367
原创 判断环形链表
如果链表中有某个节点,可以通过连续跟踪 next 指针再次到达,则链表中存在环。为了表示给定链表中的环,评测系统内部使用整数 pos 来表示链表尾连接到链表中的位置(索引从 0 开始)。此时可以用双指针法,即设置快慢两个指针,快指针每次走两个,慢指针每次走一个,若两者相遇,则有环,不相遇则说明无环。输入:head = [3,2,0,-4], pos = 1。给你一个链表的头节点 head ,判断链表中是否有环。解释:链表中有一个环,其尾部连接到第二个节点。解释:链表中有一个环,其尾部连接到第一个节点。
2023-05-26 16:43:27
80
原创 有效的字母异位词
因为英文字母只有26个,所以我们可以分别定义两个大小为26的vector动态数组,用来记录字符串S和T中出现的英文字母数量,分别遍历字符串S和T,利用下标来记录每个字母出现的次数,即每次使下标索引s[i] - ‘a’ 加一,这样便会记录字符串中每个字母出现的次数,最后进行字符串S和T的动态数组下标值匹配,若26个下标索引值都相等,则此时返回为TRUE。输入: s = “anagram”, t = “nagaram”输入: s = “rat”, t = “car”
2023-05-26 16:23:03
61
原创 验证二叉搜索树
由二叉搜索树的定义可知,其中序序列是一个递增有序的序列,则将该树以中序的方式遍历,依次压入一个动态数组vector中,若该数组里的元素是递增有序的,则该树为二叉搜索树。给你一个二叉树的根节点 root ,判断其是否是一个有效的二叉搜索树。输入:root = [5,1,4,null,null,3,6]解释:根节点的值是 5 ,但是右子节点的值是 4。所有左子树和右子树自身必须也是二叉搜索树。节点的左子树只包含 小于 当前节点的数。节点的右子树只包含 大于 当前节点的数。输入:root = [2,1,3]
2023-05-24 09:57:33
51
原创 二叉树的层序遍历
定义一个类型为vector< vector < int > > 类型的返回结果集ans,运用递归思想依次进行visit访问,当层数depth大于等于ans.size()时,说明这一层还没来过,这是第一次来,所以得进行扩容,也就是加括号,然后依次遍历左子树和右子树。给你二叉树的根节点 root ,返回其节点值的 层序遍历。输入:root = [3,9,20,null,null,15,7]输出:[[3],[9,20],[15,7]]输入:root = [1]输入:root = []
2023-05-23 21:27:45
48
原创 买卖股票的最佳时机2
解释:在第 1 天(股票价格 = 1)的时候买入,在第 5 天 (股票价格 = 5)的时候卖出, 这笔交易所能获得利润 = 5 - 1 = 4。解释:在第 2 天(股票价格 = 1)的时候买入,在第 3 天(股票价格 = 5)的时候卖出, 这笔交易所能获得利润 = 5 - 1 = 4。随后,在第 4 天(股票价格 = 3)的时候买入,在第 5 天(股票价格 = 6)的时候卖出, 这笔交易所能获得利润 = 6 - 3 = 3。输入:prices = [7,1,5,3,6,4]
2023-05-22 19:18:08
95
原创 买卖股票的最佳时机
每次进行nohold和hold的变量更新,nohold更新为(nohold,hold + prices[i])的最大值,hold更新为(hold,-prices[i])的最大值。解释:在第 2 天(股票价格 = 1)的时候买入,在第 5 天(股票价格 = 6)的时候卖出,最大利润 = 6-1 = 5。定义一个变量hold用来接收prices数组的第一个元素,即prices[0],此时需要理解这时是买入股票,所以要加上负号。由题意可知,当未持有股票的时候,收益最大,持有股票的情况下,收益最小。
2023-05-22 15:42:07
437
原创 最大子数组和
定义一个返回值res,首先将待定数组中的第一个值传给res,再定义一个sum值,初始化为0;给你一个整数数组 nums ,请你找出一个具有最大和的连续子数组(子数组最少包含一个元素),返回其最大和。输入:nums = [-2,1,-3,4,-1,2,1,-5,4]解释:连续子数组 [4,-1,2,1] 的和最大,为 6。当sum大于0时,更新sum的值为sum+num;输入:nums = [5,4,-1,7,8]当sum小于0时,更新sum的值为num。输入:nums = [1]
2023-05-21 11:21:52
48
原创 青蛙爬楼梯
由题干信息可知:当台阶数量大于等于3的时候,dp[i] = dp[i - 1] + dp[i - 2],即该项的值为后两项的和。此时利用一个for循环即可,最后返回dp[n]。本题是非常典型的动态规划的题,台阶数量为1时,有一种方法,台阶数量为2时,有两种方法…依次类推,此时可以动态分配一个大小为n+1的数组dp用来记录台阶数和方法数的对应关系。每次青蛙可以爬 1 或 2 个台阶。有多少种不同的方法可以爬到楼顶呢?解释:有两种方法可以爬到楼顶。解释:有三种方法可以爬到楼顶。1. 1 阶 + 1 阶。
2023-05-17 17:13:43
171
原创 字符串中第一个匹配的下标
给你两个字符串 haystack 和 needle ,请你在 haystack 字符串中找出 needle 字符串的第一个匹配项的下标(下标从 0 开始)。输入:haystack = “leetcode”, needle = “leeto”输入:haystack = “sadbutsad”, needle = “sad”解释:“leeto” 没有在 “leetcode” 中出现,所以返回 -1。若匹配失败,则 i 重新赋值为上次匹配的下标的后一个位置,j 重新定义为0;若匹配成功,则返回i - j;
2023-05-16 17:30:06
73
原创 目标值的组合总和
此题可以用回溯算法思想来解决该类问题,依次遍历目标candidate中的数据,和target值进行比较,若小于target值,则将该元素暂时压入动态数据vector < int > temp中,然后将target减去刚才的值再次循环此过程,当target变成0时,说明这次循环生城的序列有效,将该序列压入ans返回结果集中,并将temp数据中的元素清空。2 和 3 可以形成一组候选,2 + 2 + 3 = 7。输出: [[2,2,2,2],[2,3,3],[3,5]]输出:[[2,2,3],[7]]
2023-05-15 22:25:36
384
原创 电话号码的字符组合
若数字按键字符串不为空,则从第一位开始减去‘0’,完成字符转向数字的实现,然后根据得到的数字,按照下标索引的方式找到数组board中的具体所在位置,递归调用该函数,记录该位置下的字符,并且每次指向的输入字符串的位置加一,一直到当前指向的输入字符串位置pos 等于输入字符串的长度,此时将记录的字符压入结果数组 res 中,并进行返回。输出:[“ad”,“ae”,“af”,“bd”,“be”,“bf”,“cd”,“ce”,“cf”]输出:[“a”,“b”,“c”]输入:digits = “2”
2023-05-12 16:15:16
214
原创 链表两数相加
首先定义一个头结点,再定义一个结点指针指向头结点,当两个链表不为空时,依次摘下两个链表的值进行相加,并定义一个进位标志carry用来指明是否最高位发生进位,若发生进位,则new一个新的结点插入最后的结果链表头部,每次链表的当前值相加后指针向后偏移一个单位。给你两个 非空 的链表,表示两个非负的整数。输入:l1 = [9,9,9,9,9,9,9], l2 = [9,9,9,9]输入:l1 = [2,4,3], l2 = [5,6,4]输出:[8,9,9,9,0,0,0,1]输出:[7,0,8]
2023-05-12 11:42:09
53
原创 比特位计数
而任何奇数 x 可以表示为偶数j+1或k-1的形式(因为题目数字从0开始,所以取偶数j+1),而这个偶数j中1的个数可以表示为res[j]=res[j/2],且末尾一定是0,那么这个奇数x=j+1,所以res[x] = res[j]+1=res[j/2]+1。给你一个整数 n ,对于 0
2023-05-11 22:18:08
120
原创 顺序表有序(21.6.26)
题目描述:设顺序表用数组A[ ]表示,表中的元素存储在数组下标1~m+n中,前m个元素递增有序,后n个元素递增有序,设计一个算法,使整个顺序表都有序。算法思想:将数组A[1…m+n]视为一个已经经过m趟的插入排序的表,则从m+1趟开始,后面n个元素依次插入到前面的有序表中。代码如下:void Insert(ElemType A[],int m, int n){ int i,j; for(i=m+1;i<=m+n;i++){ //依次将A[m+1...m+n]插入有序表 A[0]=
2021-08-07 12:18:47
675
原创 简单选择排序(21.6.25)
题目描述:编写一个算法,在基于单链表表示的待排序关键字序列上进行简单选择排序。算法思想:每一趟在原始的链表中摘下关键字最大的结点,把它插入结果链表中的最前端。由于在原始链表中摘下的关键字越来越小,在结果链表前端插入的关键字也越来越小,因此最后形成的结果链表中的结点按关键字非递减的顺序来排放。代码如下:void selectSort( LinkedList & L){ LinkNode *h=L,*p,*q,*r,*s; L=NULL; while(h!=NULL){ p=s=h;
2021-08-07 11:12:13
219
原创 奇偶排序(21.6.24)
题目描绘:已知一个线性表按顺序存储,且每个元素都是不相同的整数型元素,设计一个算法,将所有的奇数移到所有偶数的前边。算法思想:本题可以采用快排的思想来做,只需要遍历一次就可以完成题目的要求,假设表长为L【1…n】,先从前向后寻找一个偶数元素L(i),再从后向前寻找一个奇数元素L(j),将二者交换,重复上面的过程,直到i>j为止。代码如下:void move(ElemType A[],int len){ int i=0,j=len-1; while(i<j){ while(i&l
2021-08-07 10:57:39
103
原创 找出第k小元素(21.6.23)
题目描述:试编写一个算法,使之能够在 数组L【1…n】中找到第k小的元素(即从小到大排序后存储于第k个位置的元素)。算法思想:利用快速排序,在数组L【1…n】中选择枢轴pivot(随机或者取第一个)进行和快速排序一样的划分操作,表L【1…n】被划分为L【1…m-1】和L【m+1…n】,其中L(m)=pivot。当m=k时,显然,此时pivot就是要找的元素,直接返回pivot即可。当m<k时,所寻找的元素一定在L【m+1…n】中,因此可以对L【m+1…n】进行递归的查找第k-m小的元素。
2021-08-07 10:40:24
436
原创 判断二叉树(21.6.22)
题目描述:给定一棵二叉树,设计一个算法判断该二叉树是否为二叉排序树。算法思路:对二叉排序树来说,其中序遍历序列是一个有序的递增序列,因此,对给定的二叉树进行中序遍历,若能保证是一个递增有序序列则说明二叉树是一个二叉排序树。代码如下:KeyType predt=-32767; //predt为全局变量,记录当前结点中序前驱的值,初值为负无穷 int Judge(BiTree bt){ int b1,b2; if(bt==NULL) return 1; //空树 else{ b1=Jud
2021-07-27 20:57:47
146
原创 树的深度(21.6.21)
题目描述:以孩子兄弟链表为存储结构,设计一个递归的算法求出该树的深度。算法思想:若树为空,高度为0;否则高度为第一子树高度加一和兄弟树高度的大者。代码如下:int Height (CSTree bt){ int ha,hb; if(bt=NULL) return 0; else{ ha=Height(bt->firstchild); //第一子树树高 hb=Height(bt->nextsibling);//兄弟的树高 if(ha+1>hb) retu
2021-07-26 17:08:49
108
原创 叶子结点数(21.6.20)
题目描述:编程求一个以孩子-兄弟表示法存储的森林的叶子结点数。算法思想:当森林(树)以孩子-兄弟表示法来存储时,若结点没有孩子,则它一定是叶子结点,总的叶子结点个数是孩子子树上的叶子数和兄弟子树上的叶子结点个数之和。代码如下:typedef struct node{ ElemType data; struct node *child,*brother;}*Tree;int Leaves(Tree t){ if(t=NULL) return 0; if(t->child==NULL
2021-07-26 17:00:19
262
原创 相似二叉树(21.6.19)
题目描述:试设计一个算法判断两个二叉树是否相似,所谓的两个二叉树相似即两个二叉树都是空树或者只有一个根节点;或者两个二叉树的右子树和左子树都相等。算法思想:本题可以采用递归的形式来求解:若两棵树都是空树则相似;若有一个是空树,而另一个不是空树,则两个必然不相似;否则便递归比较它们的左右子树是否相似。代码如下:int similar(BiTree T1,BiTree T2){ int left,right; if(T1==NULL && T2==NULL) return 1
2021-07-26 15:32:16
345
原创 二叉链表(21.6.18)
题目描述:设计一个算法,将二叉树的叶子结点按从左到右的顺序连成一个单链表,表头指针为head,二叉树按二叉链表来存储,链接时用叶结点的右指针域来存放单链表指针。算法思想:通常的我们所用的先序、中序和后序都是按从左到右的顺序来访问叶结点的,这里我们选择中序遍历。设置一个前驱的指针pre,初始情况下为空,第一个叶结点由指针head指向,遍历到叶结点的时候,就将它前驱的rchild指针指向它,最后一个rchild指针为空。代码如下:LinkedList head,pre=NULL; //全局变量 L
2021-07-26 15:20:54
255
空空如也
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人