- 博客(20)
- 收藏
- 关注
原创 代码随想录算法训练营第十六天| 104.二叉树的最大深度 、111.二叉树的最小深度、 222.完全二叉树的节点个数
完全二叉树 的定义如下:在完全二叉树中,除了最底层节点可能没填满外,其余每层节点数都达到最大值,并且最下面一层的节点都集中在该层最左边的若干位置。输入:root = [2,null,3,null,4,null,5,null,6]输入:root = [3,9,20,null,null,15,7]给定二叉树 [3,9,20,null,null,15,7],二叉树的深度为根节点到最远叶子节点的最长路径上的节点数。输入:root = [1,2,3,4,5,6]说明:叶子节点是指没有子节点的节点。
2023-06-09 15:21:02
707
原创 代码随想录算法训练营第十五天| 层序遍历 、 226.翻转二叉树 、 101. 对称二叉树
因为我们要比较的是根节点的两个子树是否是相互翻转的,进而判断这个树是不是对称树,所以要比较的是两个树,参数自然也是左子树节点和右子树节点。给你二叉树的根节点 root ,返回其节点值的 层序遍历。此时才进入单层递归的逻辑,单层递归的逻辑就是处理 左右节点都不为空,且数值相同的情况。给你一棵二叉树的根节点 root ,翻转这棵二叉树,并返回其根节点。输入:root = [1,2,2,null,3,null,3]输入:root = [1,2,2,3,4,4,3]输出:[4,7,2,9,6,3,1]
2023-06-08 10:07:53
908
1
原创 代码随想录算法训练营第十四天| 递归遍历 、迭代遍历、 统一迭代
这里帮助大家确定下来递归算法的三个要素。确定哪些参数是递归的过程中需要处理的,那么就在递归函数里加上这个参数, 并且还要明确每次递归的返回值是什么进而确定递归函数的返回类型。写完了递归算法, 运行的时候,经常会遇到栈溢出的错误,就是没写终止条件或者终止条件写的不对,操作系统也是用一个栈的结构来保存每一层递归的信息,如果递归没有终止,操作系统的内存栈必然就会溢出。确定每一层递归需要处理的信息。在这里也就会重复调用自己来实现递归的过程。
2023-06-06 09:02:29
815
原创 代码随想录算法训练营第十三天| 239. 滑动窗口最大值 、347.前 K 个高频元素
每次窗口移动的时候,调用que.pop(滑动窗口中移除元素的数值),que.push(滑动窗口添加元素的数值),然后que.front()就返回我们要的最大值。我们需要一个队列,这个队列呢,放进去窗口里的元素,然后随着窗口的移动,队列也一进一出,每次移动之后,队列告诉我们里面的最大值是什么。输入:nums = [1,3,-1,-3,5,3,6,7], k = 3。输入: nums = [1,1,1,2,2,3], k = 2。输入:nums = [1], k = 1。输出:[3,3,5,5,6,7]
2023-06-01 16:29:15
968
原创 代码随想录算法训练营第十一天| 20. 有效的括号 、 1047. 删除字符串中的所有相邻重复项 、 150. 逆波兰表达式求值
之后我们得到字符串 "aaca",其中又只有 "aa" 可以执行重复项删除操作,所以最后的字符串为 "ca"。然后再去做对应的消除操作。输入:tokens = ["10","6","9","3","+","-11","*","/","*","17","+","5","+"]给定一个只包括 '(',')','{','}','[',']' 的字符串 s ,判断字符串是否有效。输入:tokens = ["4","13","5","/","+"]输入:tokens = ["2","1","+","3","*"]
2023-05-31 16:43:58
1146
1
原创 代码随想录算法训练营第十天| 232.用栈实现队列 、 225. 用队列实现栈
在代码实现的时候,会发现pop() 和 peek()两个函数功能类似,代码实现上也是类似的,可以思考一下如何把代码抽象一下。请你仅使用两个队列实现一个后入先出(LIFO)的栈,并支持普通栈的全部四种操作(push、top、pop 和 empty)。,把que1最后面的元素以外的元素都备份到que2,然后弹出最后面的元素,再把其他元素从que2导回que1。boolean empty() 如果栈是空的,返回 true;使用栈来模式队列的行为,如果仅仅用一个栈,是一定不行的,所以需要两个栈。
2023-05-30 15:53:54
1153
1
原创 代码随想录算法训练营第八天| 344.反转字符串 、 541. 反转字符串II、剑指Offer 05.替换空格、151.翻转字符串里的单词 、剑指Offer58-II.左旋转字符串
比如,输入字符串"abcdefg"和数字2,该函数将返回左旋转两位得到的结果"cdefgab"。给定一个字符串 s 和一个整数 k,从字符串开头算起,每计数至 2k 个字符,就反转这 2k 字符中的前 k 个字符。单词 是由非空格字符组成的字符串。解释:如果两个单词间有多余的空格,反转后的字符串需要将单词间的空格减少到仅有一个。输入:s = ["H","a","n","n","a","h"]输入:s = ["h","e","l","l","o"]输出:["h","a","n","n","a","H"]
2023-05-30 11:23:13
1120
1
原创 代码随想录算法训练营第七天| 454.四数相加II 、383. 赎金信、15. 三数之和、18. 四数之和
四数之和的双指针解法是两层for循环nums[k] + nums[i]为确定值,依然是循环内有left和right下标作为双指针,找出nums[k] + nums[i] + nums[left] + nums[right] == target的情况,三数之和的时间复杂度是O(n^2),四数之和的时间复杂度是O(n^3)。输入:nums1 = [0], nums2 = [0], nums3 = [0], nums4 = [0]输出:[[-2,-1,1,2],[-2,0,0,2],[-1,0,0,1]]
2023-05-25 17:00:13
1146
原创 代码随想录算法训练营第六天| 242.有效的字母异位词 349. 两个数组的交集 202. 快乐数 1. 两数之和
第一个for循环用来记录s中的字母个数,每个字母对应的数组元素+1,第二个for循环用来记录t中的字母个数,每个字母对应的数组元素-1,如果数组中的所有元素不为0,说明不是字母异位词,否则是。在遍历数组的时候,只需要向map去查询是否有和目前遍历元素匹配的数值,如果有,就找到的匹配对,如果没有,就把目前遍历的元素放进map中,因为map存放的就是我们访问过的元素。本题呢,我就需要一个集合来存放我们遍历过的元素,然后在遍历数组的时候去询问这个集合,某元素是否遍历过,也就是 是否出现在这个集合。
2023-05-22 11:16:51
1218
原创 代码随想录算法训练营第四天|24. 两两交换链表中的节点 19.删除链表的倒数第N个节点 面试题 02.07. 链表相交 142.环形链表II
时间复杂度O(n + m)的解法,设curA和curB两个指针分别指向headA和headB,我们求出两个链表的长度,并求出两个链表长度的差值,然后让curA移动到和curB 末尾对齐的位置,此时我们就可以比较curA和curB是否相同,如果不相同,同时向后移动curA和curB,如果遇到curA == curB,则找到交点。给你一个链表,两两交换其中相邻的节点,并返回交换后链表的头节点。从各自的表头开始算起,链表 A 为 [4,1,8,4,5],链表 B 为 [5,0,1,8,4,5]。
2023-05-18 22:00:55
1472
原创 代码随想录算法训练营第三天| 203.移除链表元素、707.设计链表 、206.反转链表
void addAtIndex(int index, int val) 将一个值为 val 的节点插入到链表中下标为 index 的节点之前。移除头结点和移除其他节点的操作是不一样的,因为链表的其他节点都是通过前一个节点来移除当前节点,而头结点没有前一个节点。因为接下来要改变 cur->next 的指向了,将cur->next 指向pre ,此时已经反转了第一个节点了。void addAtTail(int val) 将一个值为 val 的节点追加到链表中作为链表的最后一个元素。
2023-05-18 11:14:57
1386
原创 代码随想录算法训练营第二天| 977.有序数组的平方、209.长度最小的子数组、59.螺旋矩阵II
找出该数组中满足其和 ≥ target 的长度最小的 连续子数组 [numsl, numsl+1, ..., numsr-1, numsr] ,并返回其长度。输入:target = 11, nums = [1,1,1,1,1,1,1,1]输入:target = 7, nums = [2,3,1,2,4,3]解释:平方后,数组变为 [16,1,0,9,100]输入:nums = [-4,-1,0,3,10]排序后,数组变为 [0,1,9,16,100]输出:[0,1,9,16,100]
2023-05-17 09:36:14
1479
原创 代码随想录算法训练营第一天| 704. 二分查找、 27. 移除元素
给定一个 n 个元素有序的(升序)整型数组 nums 和一个目标值 target ,写一个函数搜索 nums 中的 target,如果目标值存在返回下标,否则返回 -1。示例 1:输入: nums = [-1,0,3,5,9,12], target = 9输出: 4解释: 9 出现在 nums 中并且下标为 4示例 2:输入: nums = [-1,0,3,5,9,12], target = 2输出: -1解释: 2 不存在 nums 中因此返回 -1。
2023-05-16 11:11:05
1595
1
翻译 通过改换运算符能达到精简代码的例子
通过改换运算符能达到精简代码的例子还有:1.把求余运算表达式改为位与运算表达式。如:b=a%8 可以改为:b=a&7。2.把乘法运算表达式改为左移运算表达式。如:b=a*8 可以改为:b=a<<3。3.把除法运算表达式改为右移运算表达式。如:b=a/8 可以改为:b=a>>3。...
2019-04-13 14:12:39
140
原创 逻辑左移,逻辑右移,算术左移,算术右移的区分
逻辑左移(SHL)和算数左移(SAL),规则相同,右边统一添0 逻辑右移(SHR),左边统一添0 算数右移(SAR),左边添加的数和符号有关 (正数补0,负数补1)比如一个有符号位的8位二进制数11001101,逻辑右移不管符号位,如果移一位就变成01100110。算术右移要管符号位,右移一位变成11100110。e.g:1010101010,其中[]位是...
2019-03-29 15:02:55
12024
原创 OJ小练之“2^x mod n = 1”
Problem description Give a number n, find the minimum x that satisfies 2^x mod n = 1. Input One positive integer on each line, the value of n. Output If the minimum x exists, pri...
2019-03-23 15:17:51
697
转载 数据结构中的抽象数据类型(ADT)
1、首先了解什么是数据类型?数据类型:是一组性质相同的值的集合以及定义在此集合上的一些操作的总称。 解释:数据类型是按值的不同进行划分的。在高级语言中,每个变量、常量及表达式都有各自的取值范围,类型就用来说明变量或表达式的取值范围和所能进行的操作。 在C语言中,按照取值不同,数据类型可分为两类: ①、原子类型:是不可再分解的基本类型,包括整型、实型、字符型等。...
2018-10-13 20:57:12
1504
转载 string 中erase函数的用法
string 中erase函数的用法:(1)string& erase ( size_t pos = 0, size_t n = npos );(2)iterator erase ( iterator position );(3)iterator erase ( iterator first, iterator last );也就是说有三种用法:(1)erase(pos,n); ...
2018-09-15 20:03:40
838
原创 计算机领域中的实数
实数包括有理数和无理数。其中无理数就是无限不循环小数,有理数就包括整数和分数。数学上,实数直观地定义为和数轴上的点一一对应的数。本来实数仅称作数,后来引入了虚数概念,原本的数称作“实数”——意义是“实在的数”(任何实数都可在数轴上表示)。数学上,实数直观地定义为和数轴上的点一一对应的数。本来实数仅称作数,后来引入了虚数概念,原本的数称作“实数”——意义是“实在的数”。实数可以分为有理数和无理数(如...
2018-08-22 15:21:19
2177
空空如也
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人