LeetCode
本专栏是作者在leetcode刷题经历的汇总,包括了题目的讲解和一些编程的技巧
HanWagner
保持对技术的尊敬,这是一群辛苦努力的群体
展开
-
快速乘和快速幂以及常用运算
【快速乘】推荐int quickMulti(int A, int B) { int ans = 0; for ( ; B; B >>= 1) { if (B & 1) { ans += A; } A <<= 1; } return ans;}(B&1) && (ans += A)A <<= 1B >>= 1【快速原创 2021-01-15 10:50:13 · 153 阅读 · 0 评论 -
DFS和BFS原理以及简单模板
【文章概要】【内容分析】DFS 算法思想:向深处搜索,直到找到解或者走不下去BFS算法简单模板原创 2021-01-15 10:48:51 · 606 阅读 · 0 评论 -
leetcode系列41-缺失的第一个正数
【题目概要】41. 缺失的第一个正数给你一个未排序的整数数组,请你找出其中没有出现的最小的正整数示例 1:输入: [1,2,0]输出: 3示例 2:输入: [3,4,-1,1]输出: 2示例 3:输入: [7,8,9,11,12]输出: 1【代码示例】// 第一步将所有不在【1,numsSize】中的数值进行numsSize+1的转化为新的数组// 存在范围内的就是将其转化为负数// 判断新数组第一个大于0的位置,如果全是负数,则就是numsSize+1int fir原创 2020-09-29 11:25:48 · 372 阅读 · 0 评论 -
leetcode系列面试题 01.07. 旋转矩阵
【题目概要】面试题 01.07. 旋转矩阵给你一幅由 N × N 矩阵表示的图像,其中每个像素的大小为 4 字节。请你设计一种算法,将图像旋转 90 度。不占用额外内存空间能否做到?示例 1:给定 matrix = [ [1,2,3], [4,5,6], [7,8,9]],原地旋转输入矩阵,使其变为:[ [7,4,1], [8,5,2], [9,6,3]]【代码示例】void rotate(int** matrix, int matrixSize, i原创 2020-07-31 16:43:50 · 331 阅读 · 0 评论 -
leetcode系列106-从中序与后序遍历序列构造二叉树
【题目概要】106. 从中序与后序遍历序列构造二叉树根据一棵树的中序遍历与后序遍历构造二叉树。注意:你可以假设树中没有重复的元素。例如,给出中序遍历 inorder = [9,3,15,20,7]后序遍历 postorder = [9,15,7,20,3]返回如下的二叉树: 3 / \ 9 20 / \ 15 7【代码示例】/** * Definition for a binary tree node. * struct TreeNode原创 2020-07-31 16:41:51 · 152 阅读 · 0 评论 -
leetcode系列142-环形链表 II
【题目概要】142. 环形链表 II给定一个链表,返回链表开始入环的第一个节点。 如果链表无环,则返回 null。为了表示给定链表中的环,我们使用整数 pos 来表示链表尾连接到链表中的位置(索引从 0 开始)。 如果 pos 是 -1,则在该链表中没有环。说明:不允许修改给定的链表。示例 1:输入:head = [3,2,0,-4], pos = 1输出:tail connects to node index 1解释:链表中有一个环,其尾部连接到第二个节点。【思路分析】设置快慢指原创 2020-07-31 16:40:59 · 154 阅读 · 0 评论 -
leetcode系列54-螺旋矩阵
【题目概要】54. 螺旋矩阵给定一个包含 m x n 个元素的矩阵(m 行, n 列),请按照顺时针螺旋顺序,返回矩阵中的所有元素。示例 1:输入:[ [ 1, 2, 3 ], [ 4, 5, 6 ], [ 7, 8, 9 ]]输出: [1,2,3,6,9,8,7,4,5]【代码示例】/** * Note: The returned array must be malloced, assume caller calls free(). */int* spiralOrder(原创 2020-07-23 11:42:24 · 174 阅读 · 0 评论 -
leetcode系列36-有效的数独
【题目概要】 1. 有效的数独判断一个 9x9 的数独是否有效。只需要根据以下规则,验证已经填入的数字是否有效即可。 数字 1-9 在每一行只能出现一次。 数字 1-9 在每一列只能出现一次。 数字 1-9 在每一个以粗实线分隔的 3x3 宫内只能出现一次。数独部分空格内已填入了数字,空白格用 '.' 表示。【思路分析】针对每一行,每一列,以及每一个3×3的九宫格进行有效性的验证,因此需要的3个9×9的数组来分别存储相应的结果每一个3×3的的九宫格怎么推理,原创 2020-07-23 10:29:50 · 199 阅读 · 0 评论 -
leetcode系列46-全排列
18、排列組合算法参考文献组合:void combine(int *a, int *b, int m, int n, int N){ for(int i=m; i>=n; i--) { b[n-1] = i-1; if(n>1) combine(a, b, i-1, n-1, N) else { for(int i=N-1; i>=0; i--) {打印结果出来} } }}...原创 2020-07-22 15:27:34 · 125 阅读 · 0 评论 -
leetcode系列3-无重复字符的最长子串(简单的滑动窗口法和回溯算法)
14、無重複字符的最長子串參考文獻【實例】字符串是:“fabcade”。1、当开始比较字符串的时候,begin指向了第一个字符f,now也指向了第一个字符f,当前只有一个字符,也就不需要比较是否重复。2、然后读取第二个字符,begin依然指向f,now指向了字符a,这个就需要比较一下a是否与之前的相同,没有相同的就继续读取。3、当now指向第二个a的时候,begin指向f,此时发现前面已经有了一个a了,(这里可以先记录一下当前字符串长度)所以begin就需要往后移动到a后面的b的位置,则当前的字符串原创 2020-07-22 15:13:00 · 201 阅读 · 0 评论 -
leetcode系列23-合并K个排序链表
【题目概要】23. 合并K个排序链表合并 k 个排序链表,返回合并后的排序链表。请分析和描述算法的复杂度。示例:输入:[ 1->4->5, 1->3->4, 2->6]输出: 1->1->2->3->4->4->5->6【思路分析】...原创 2020-07-22 14:43:49 · 165 阅读 · 0 评论 -
leetcode系列4-寻找两个正序数组的中位数
【题目概要】4. 寻找两个正序数组的中位数给定两个大小为 m 和 n 的正序(从小到大)数组 nums1 和 nums2。请你找出这两个正序数组的中位数,并且要求算法的时间复杂度为 O(log(m + n))。你可以假设 nums1 和 nums2 不会同时为空。示例 1:nums1 = [1, 3]nums2 = [2]则中位数是 2.0示例 2:nums1 = [1, 2]nums2 = [3, 4]则中位数是 (2 + 3)/2 = 2.5【思路分析】将多个排序数组原创 2020-07-22 13:15:12 · 169 阅读 · 0 评论 -
leetcode系列8-字符串转换整数 (atoi)
【题目概要】8. 字符串转换整数 (atoi)请你来实现一个 atoi 函数,使其能将字符串转换成整数。首先,该函数会根据需要丢弃无用的开头空格字符,直到寻找到第一个非空格的字符为止。接下来的转化规则如下: 如果第一个非空字符为正或者负号时,则将该符号与之后面尽可能多的连续数字字符组合起来,形成一个有符号整数。 假如第一个非空字符是数字,则直接将其与之后连续的数字字符组合起来,形成一个整数。 该字符串在有效的整数部分之后也可能会存在多余的字符,那么这些字符可以被忽略,它们对函原创 2020-07-22 13:08:07 · 145 阅读 · 0 评论 -
leetcode系列5-最长回文子串
【题目概要】5. 最长回文子串给定一个字符串 s,找到 s 中最长的回文子串。你可以假设 s 的最大长度为 1000。示例 1:输入: "babad"输出: "bab"注意: "aba" 也是一个有效答案。示例 2:输入: "cbbd"输出: "bb"【思路分析】以每个节点最为中心点,向两边发散,循环比较值相等,分为odd和even两种情况...原创 2020-07-22 11:53:59 · 132 阅读 · 0 评论 -
leetcode系列43-字符串相乘
【题目概要】43. Multiply StringsGiven two non-negative integers num1 and num2 represented as strings, return the product of num1 and num2, also represented as a string.Example 1:Input: num1 = "2", num2 = "3"Output: "6"Example 2:Input: num1 = "123", num2原创 2020-07-22 11:53:11 · 138 阅读 · 0 评论 -
leetcode系列98-验证二叉搜索树
【题目概要】98. 验证二叉搜索树给定一个二叉树,判断其是否是一个有效的二叉搜索树。假设一个二叉搜索树具有如下特征: 节点的左子树只包含小于当前节点的数。 节点的右子树只包含大于当前节点的数。 所有左子树和右子树自身必须也是二叉搜索树。 输入: 2 / \ 1 3输出: true输入: 5 / \ 1 4 / \ 3 6输出: false解释: 输入为: [5,1,4,null,null,3原创 2020-07-22 11:46:26 · 83 阅读 · 0 评论 -
leetcode系列2-两数相加(链表)
【题目概要】2. 两数相加给出两个 非空 的链表用来表示两个非负的整数。其中,它们各自的位数是按照 逆序 的方式存储的,并且它们的每个节点只能存储 一位 数字。如果,我们将这两个数相加起来,则会返回一个新的链表来表示它们的和。您可以假设除了数字 0 之外,这两个数都不会以 0 开头。示例:输入:(2 -> 4 -> 3) + (5 -> 6 -> 4)输出:7 -> 0 -> 8原因:342 + 465 = 807【思路分析】以其中任一链表作为原创 2020-07-22 11:41:04 · 179 阅读 · 0 评论 -
leetcode系列34-在排序数组中查找元素的第一个和最后一个位置
【题目概要】34. 在排序数组中查找元素的第一个和最后一个位置给定一个按照升序排列的整数数组 nums,和一个目标值 target。找出给定目标值在数组中的开始位置和结束位置。你的算法时间复杂度必须是 O(log n) 级别。如果数组中不存在目标值,返回 [-1, -1]。示例 1:输入: nums = [5,7,7,8,8,10], target = 8输出: [3,4]示例 2:输入: nums = [5,7,7,8,8,10], target = 6输出: [-1,-1]原创 2020-07-22 11:20:29 · 144 阅读 · 0 评论 -
leetcode系列61-旋转链表
【题目概要】61. 旋转链表给定一个链表,旋转链表,将链表每个节点向右移动 k 个位置,其中 k 是非负数。示例 1:输入: 1->2->3->4->5->NULL, k = 2输出: 4->5->1->2->3->NULL解释:向右旋转 1 步: 5->1->2->3->4->NULL向右旋转 2 步: 4->5->1->2->3->NULL示例 2:输入: 0原创 2020-07-22 11:00:00 · 218 阅读 · 0 评论 -
leetcode系列498-对角线遍历
【题目概要】498. 对角线遍历给定一个含有 M x N 个元素的矩阵(M 行,N 列),请以对角线遍历的顺序返回这个矩阵中的所有元素,对角线遍历如下图所示。示例:输入:[ [ 1, 2, 3 ], [ 4, 5, 6 ], [ 7, 8, 9 ]]输出: [1,2,4,7,5,3,6,8,9]【思路分析】先计算总共需要循环几次,row+col-1,然后如何分开每一次的方向,以及在遍历的过程中出现范围越界处理方式,共有几种越界方式?...原创 2020-07-22 10:54:32 · 195 阅读 · 0 评论 -
leetcode系列151-翻转字符串里的单词
【题目概要】151. 翻转字符串里的单词给定一个字符串,逐个翻转字符串中的每个单词。示例 1:输入: "the sky is blue"输出: "blue is sky the"【思路分析】高级语言中,可以先分开单词,以空格为界限,然后反转,加入空格等操作本文用两种方法尝试,C语言中用栈结构,从后往前遍历,遇见非空格入栈,遇见空格,出栈,需要注意的是几种特殊格式字符串的处理“” “ " " t" "fdgasg" 【代码示例1】char * rever原创 2020-07-22 10:39:58 · 208 阅读 · 0 评论 -
leetcode系列162-寻找峰值
【题目概要】【思路分析】一般二分法是对有序数组查找,本题堆二分查找进行一点修改。首先从数组 nums中找到中间的元素 mid。若该元素恰好位于降序序列或者一个局部下降坡度中(通过将 nums[i]与右侧比较判断),则说明峰值会在本元素的左边。于是,我们将搜索空间缩小为 mid的左边(包括其本身),并在左侧子数组上重复上述过程若该元素恰好位于升序序列或者一个局部上升坡度中(通过将 nums[i] 与右侧比较判断),则说明峰值会在本元素的右边。于是,我们将搜索空间缩小为 mid的右边,并在右侧子数组上重原创 2020-07-22 10:37:00 · 343 阅读 · 0 评论 -
leetcode系列234-回文链表
【题目概要】234. Palindrome Linked ListGiven a singly linked list, determine if it is a palindrome.Example 1:Input: 1->2Output: falseExample 2:Input: 1->2->2->1Output: trueFollow up:Could you do it in O(n) time and O(1) space?【思路分析】原创 2020-07-22 10:23:10 · 85 阅读 · 0 评论 -
leetcode系列116-填充每个节点的下一个右侧节点指针
【题目概要】116. 填充每个节点的下一个右侧节点指针给定一个完美二叉树,其所有叶子节点都在同一层,每个父节点都有两个子节点。二叉树定义如下:struct Node { int val; Node *left; Node *right; Node *next;}填充它的每个 next 指针,让这个指针指向其下一个右侧节点。如果找不到下一个右侧节点,则将 next 指针设置为 NULL。初始状态下,所有 next 指针都被设置为 NULL。【思路分析】通过head来连接原创 2020-07-22 09:50:00 · 153 阅读 · 0 评论 -
leetcode系列189-旋转数组
【题目概要】189. Rotate ArrayGiven an array, rotate the array to the right by k steps, where k is non-negative.Follow up: Try to come up as many solutions as you can, there are at least 3 different ways to solve this problem. Could you do it in-place原创 2020-07-22 08:58:06 · 132 阅读 · 0 评论 -
leetcode系列62-不同路径
【题目概要】62. Unique PathsA robot is located at the top-left corner of a m x n grid (marked 'Start' in the diagram below).The robot can only move either down or right at any point in time. The robot is trying to reach the bottom-right corner of the grid (ma原创 2020-07-22 08:51:41 · 141 阅读 · 0 评论 -
leetcode系列209-长度最小的子数组
【题目概要】209. 长度最小的子数组给定一个含有 n 个正整数的数组和一个正整数 s ,找出该数组中满足其和 ≥ s 的长度最小的 连续 子数组,并返回其长度。如果不存在符合条件的子数组,返回 0。示例:输入:s = 7, nums = [2,3,1,2,4,3]输出:2解释:子数组 [4,3] 是该条件下的长度最小的子数组。进阶: 如果你已经完成了 O(n) 时间复杂度的解法, 请尝试 O(n log n) 时间复杂度的解法。【思路分析】考虑直接在O(n)的范围内,遍历原创 2020-07-22 07:41:01 · 132 阅读 · 0 评论 -
leetcode系列19-删除链表的倒数第N个节点
【题目概要】19. 删除链表的倒数第N个节点给定一个链表,删除链表的倒数第 n 个节点,并且返回链表的头结点。示例:给定一个链表: 1->2->3->4->5, 和 n = 2.当删除了倒数第二个节点后,链表变为 1->2->3->5.说明:给定的 n 保证是有效的。进阶:你能尝试使用一趟扫描实现吗?【思路分析】常规的采用快慢指针的做法,需要注意以下几个特殊情况[1],1 [1, 2] 1当删除倒数第1个节点时,需要记住原创 2020-07-22 07:37:52 · 100 阅读 · 0 评论 -
leetcode系列145-二叉树的后序遍历
【题目概要】145. 二叉树的后序遍历给定一个二叉树,返回它的 后序 遍历。示例:输入: [1,null,2,3] 1 \ 2 / 3 输出: [3,2,1]【思路分析】利用迭代的方式方法,构建栈结构,循环将左子树存入栈中,flag设置判断是否此时处于右子树,flag = 0(代表右子树未能遍历,需要遍历)【代码示例】/** * Definition for a binary tree node. * struct TreeNode {原创 2020-07-22 07:34:48 · 129 阅读 · 0 评论 -
leetcode系列 11-盛最多水的容器
【题目概要】 11. 盛最多水的容器给你 n 个非负整数 a1,a2,...,an,每个数代表坐标中的一个点 (i, ai) 。在坐标内画 n 条垂直线,垂直线 i 的两个端点分别为 (i, ai) 和 (i, 0)。找出其中的两条线,使得它们与 x 轴共同构成的容器可以容纳最多的水。说明:你不能倾斜容器,且 n 的值至少为 2。图中垂直线代表输入数组 [1,8,6,2,5,4,8,3,7]。在此情况下,容器能够容纳水(表示为蓝色部分)的最大值为 49。示例:输入:[1,8,6,2,5,4,8,原创 2020-07-21 17:21:29 · 91 阅读 · 0 评论 -
leetcode系列215-数组中的第K个最大元素
【题目概要】215. 数组中的第K个最大元素在未排序的数组中找到第 k 个最大的元素。请注意,你需要找的是数组排序后的第 k 个最大的元素,而不是第 k 个不同的元素。示例 1:输入: [3,2,1,5,6,4] 和 k = 2输出: 5示例 2:输入: [3,2,3,1,2,4,5,5,6] 和 k = 4输出: 4说明:你可以假设 k 总是有效的,且 1 ≤ k ≤ 数组的长度。【思路分析】需要找的是数组排序后的第 k 个最大的元素,而不是第k个不同的数本题尝试了用快原创 2020-07-21 17:17:22 · 114 阅读 · 0 评论 -
leetcode系列89-格雷编码
15、格雷碼解法參考文獻1、利用遞歸的思想來生成格雷碼2位格雷碼:00 01 11 102、二進制——格雷碼对n位二进制的码字,从右到左,以0到n-1编号如果二进制码字的第i位和i+1位相同,则对应的格雷码的第i位为0,否则为1(当i+1=n时,二进制码字的第n位被认为是0,即第n-1位不变)【結論】從左往右,兩兩^亦或,最高位的左邊默認是03、格雷碼——二進制【結論】從左往右兩兩亦或,從左邊的第2位開始,最高位值不變,相當於講上面的步驟重複一次則返回原值 (Bi+1 = Gi ^原创 2020-07-21 17:14:35 · 237 阅读 · 0 评论 -
leetcode系列236-二叉树的最近公共祖先
【题目概要】236. Lowest Common Ancestor of a Binary TreeGiven a binary tree, find the lowest common ancestor (LCA) of two given nodes in the tree.According to the definition of LCA on Wikipedia: “The lowest common ancestor is defined between two nodes p and原创 2020-07-21 16:40:55 · 153 阅读 · 0 评论 -
leetcode系列235-二叉搜索树的最近公共祖先
16、普通二叉樹的2節點的最近公共祖先Lowest Common Ancestor參考文獻【思路】若是任意一個節點和根節點匹配,則根爲LCA如果和根節點不匹配,在遞歸在左右子樹中尋找節點,如果某節點左子樹存在一個節點,右子樹也存在一個節點,則此節點爲LCA如果两个节点都位于左子树中,则LCA也位于左子树中,否则LCA位于右子树中...原创 2020-07-21 16:39:36 · 115 阅读 · 0 评论 -
leetcode系列7-整数反转
【题目概要】7. Reverse IntegerGiven a 32-bit signed integer, reverse digits of an integer.Example 1:Input: 123Output: 321Example 2:Input: -123Output: -321【思路分析】将正负数,统一为正数来处理,同时在翻转的过程中,注意判断是否存在溢出【代码示例】int reverse(int x){ int re = 0; if(x原创 2020-07-21 16:18:49 · 112 阅读 · 0 评论 -
leetcode系列724-寻找数组的中心索引(左边数==右边数)
【题目概要】724. Find Pivot IndexGiven an array of integers nums, write a method that returns the "pivot" index of this array.We define the pivot index as the index where the sum of all the numbers to the left of the index is equal to the sum of all the numb原创 2020-07-21 16:00:19 · 140 阅读 · 0 评论 -
leetcode系列14-最长公共前缀
【题目概要】14. Longest Common PrefixWrite a function to find the longest common prefix string amongst an array of strings.If there is no common prefix, return an empty string "".Example 1:Input: ["flower","flow","flight"]Output: "fl"Example 2:Input:原创 2020-07-21 15:55:54 · 94 阅读 · 0 评论 -
leetcode系列69-x的平方根
【题目概要】69. x 的平方根实现 int sqrt(int x) 函数。计算并返回 x 的平方根,其中 x 是非负整数。由于返回类型是整数,结果只保留整数的部分,小数部分将被舍去。示例 1:输入: 4输出: 2示例 2:输入: 8输出: 2说明: 8 的平方根是 2.82842..., 由于返回类型是整数,小数部分将被舍去。【思路分析】选择1-x中的某一个数n,并且计算n×n和x之间的关系,通过二分法找到该值【代码示例】int mySqrt(int原创 2020-07-21 15:39:35 · 99 阅读 · 0 评论 -
leetcode系列33-搜索旋转排序数组
【题目概要】33. 搜索旋转排序数组假设按照升序排序的数组在预先未知的某个点上进行了旋转。( 例如,数组 [0,1,2,4,5,6,7] 可能变为 [4,5,6,7,0,1,2] )。搜索一个给定的目标值,如果数组中存在这个目标值,则返回它的索引,否则返回 -1 。你可以假设数组中不存在重复的元素。你的算法时间复杂度必须是 O(log n) 级别。示例 1:输入: nums = [4,5,6,7,0,1,2], target = 0输出: 4示例 2:输入: nums = [4,5原创 2020-07-21 15:00:08 · 125 阅读 · 0 评论 -
leetcode系列278-第一个错误的版本
【题目概要】278. First Bad VersionYou are a product manager and currently leading a team to develop a new product. Unfortunately, the latest version of your product fails the quality check. Since each version is developed based on the previous version, all the原创 2020-07-21 14:29:35 · 100 阅读 · 0 评论