leecode专题

LeeCode 30

LeeCode 30 题目: 思路: 朴素的想法,是创建一个 m p mp mp哈希表记录 w o r d s words words中所有字符出现的次数,令 n n n为 s . s i z e ( ) s.size() s.size(), m m m为 w o r d s . s i z e ( ) words.size() words.size(), l e n len len为

Leecode解题的8大模式

在 LeetCode 上刷题时,很多题目看似复杂,但实际上,许多问题可以归纳为几种常见的算法模式。 如果掌握了这些模式,就能高效地解决大量问题。 一、滑动窗口:优化子数组和子字符串问题 滑动窗口是一种常用的技巧,特别适合解决子数组和子字符串相关的问题。滑动窗口的核心思想是在一个可变大小的窗口中维护一些信息,并通过窗口的移动来缩小问题的范围。 一般来说,可以通过三问三答的形式进行思考: 1、对于

LeeCode Practice Journal | Day50_Graph01

( LeeCode) 797. 所有的可能路径 题目:797. 所有可能的路径 - 力扣(LeetCode) 题解:代码随想录 (programmercarl.com) solution DFS public class Solution {public IList<IList<int>> results = new List<IList<int>>();public IList<int>

leecode 链表

剑指 Offer 24. 反转链表 https://leetcode-cn.com/problems/fan-zhuan-lian-biao-lcof/ 递归写法 /*** Definition for singly-linked list.* struct ListNode {* int val;* struct ListNode *next;* };*/struct

(分治算法6) leecode 108 将有序数组转换成二叉搜索树

题目描述 给定一个单链表的头节点 head ,其中的元素 按升序排序 ,将其转换为平衡二叉搜索树。 求解 二叉搜索树指的是中序遍历是二叉搜索树。 如果想要让二叉搜索树保持平衡,这种构建树的方式也不是唯一的。 我们可以选择中间数字作为二叉搜索树的根节点,这样分给左右子树的数字个数相同或者只相差1,可以使得树保持平衡。如果数组长度是奇数,则根节点的选择是唯一的,如果数组的长度是偶数,则可以选择中

(分治算法5)leecode 106 从中序和后续遍历序列构成二叉树

题目描述 给定两个整数数组 inorder 和 postorder ,其中 inorder 是二叉树的中序遍历, postorder 是同一棵树的后序遍历,请你构造并返回这颗 二叉树 。 分治递归算法 后序遍历的次序: 左-右-中 中序遍历的次序:左-中-右 可以发现,后续遍历的最后一个节点是该序列对应树或者子树的根节点root。 从中序遍历中可以找到root的坐标(无重复元素),那么中序遍

个人关于Leecode 49题见解(保姆级)

题目: 49. 字母异位词分组 中等 相关标签 相关企业 给你一个字符串数组,请你将 字母异位词 组合在一起。可以按任意顺序返回结果列表。 字母异位词 是由重新排列源单词的所有字母得到的一个新单词。 示例 1: 输入: strs = ["eat", "tea", "tan", "ate", "nat", "bat"]输出: [["bat"],["nat","tan"],[

Leecode---技巧---颜色分类、下一个排列、寻找重复数

思路: 遍历一遍记录0,1,2的个数,然后再遍历一次,按照0,1,2的个数修改nums即可。 class Solution{public:void sortColors(vector<int>& nums){int n0 = 0, n1 = 0, n2 = 0;for(int x: nums){if(x==0) n0++;else if(x==1) n1++;else n2++;}for(

Leecode---技巧---只出现一次的数字 / 多数元素

题解: 利用异或运算 a⊕a = 0 的性质,可用来消除所有出现了两次的元素,最后剩余的即为所得。 class Solution{public:int singleNumber(vector<int>& nums){// 初始化为0int ans = 0;for(int x: nums){// 异或操作ans ^= x;}return ans;}}; sort排序法的两种解法:

Leecode---多维动态规划---不同路径 / 最小路径和 /最长公共子序列

动态规划—三部曲: 1、确定dp数组以及下标含义 dp[i][j]:表示从(0,0)出发,到(i,j)有dp[i][j]条不同的路径 2、确定递推公式 dp[i][j] = dp[i-1][j] + dp[i][j-1] 3、dp数组的初始化 如何初始化,dp[i][0]一定都是1,因为从(0,0)到(0,i)的路径只有一条,dp[0][j]同理: for (int i = 0; i<m; i

Leecode---多维动态规划---不同路径 / 最小路径和

动态规划—三部曲: 1、确定dp数组以及下标含义 dp[i][j]:表示从(0,0)出发,到(i,j)有dp[i][j]条不同的路径 2、确定递推公式 dp[i][j] = dp[i-1][j] + dp[i][j-1] 3、dp数组的初始化 如何初始化,dp[i][0]一定都是1,因为从(0,0)到(0,i)的路径只有一条,dp[0][j]同理: for (int i = 0; i<m; i

Leecode---栈---每日温度 / 最小栈及栈和队列的相互实现

栈:先入后出;队列:先入先出 一、每日温度 Leecode—739题目: 给定一个整数数组 temperatures ,表示每天的温度,返回一个数组 answer ,其中 answer[i] 是指对于第 i 天,下一个更高温度出现在几天后。如果气温在这之后都不会升高,请在该位置用 0 来代替。 单调栈思路: 1、新建一个存储数组下标的栈,将数组元素的下标依次入栈; 2、入栈的过程中,要保证栈是

Leecode热题100---二分查找--4:寻找两个正序数组的中位数

题目: 给定两个大小分别为 m 和 n 的正序(从小到大)数组 nums1 和 nums2。请你找出并返回这两个正序数组的 中位数 。 解法1、暴力解法(归并) 思路: 合并 nums1,nums2 为第三个数组 排序第三个数组 按下标,找出中位数 class Solution{public:double findMedianSortedArrays(vector<int>& nums1

Leecode热题100---78:子集(回溯)

题目: 给你一个整数数组 nums ,数组中的元素 互不相同 。返回该数组所有可能的子集。 解集 不能 包含重复的子集。你可以按 任意顺序 返回解集。 注:子集、组合与排列是不同性质的概念。子集、组合是无顺序的({1, 2} 和{2, 1}是同一个集合),而排列是和元素顺序有关。 既然是无序,取过的元素不会重复取,写回溯算法的时候,for就要从startIndex开始,而不是从0开始! num

leecode 226 翻转二叉树、101 对称二叉树、104 二叉树的最大深度

leecode 226 翻转二叉树、101 对称二叉树、104 二叉树的最大深度 leecode 226 翻转二叉树 题目链接 :https://leetcode.cn/problems/invert-binary-tree/description/ 题目 给你一棵二叉树的根节点 root ,翻转这棵二叉树,并返回其根节点。 示例 1: 输入:root = [4,2,7,1,3,6,9

leecode 637 二叉树的层平均值

leetcode 二叉树相关-层序遍历专题 二叉树的层序遍历一般来说,我们是利用队列来实现的,先把根节点入队,然后在出队后将其对应的子节点入队,然后往复此种操作。相比于二叉树的遍历递归,层序遍历比较简单,有些题目用想不出递归的解法,用层序遍历也是可以解答。我个人觉得层序遍历可以按照这个模板: class Solution {public void levelOrder(TreeNode roo

leecode 1206|跳表的设计

跳表 跳表,一种链表数据结构,其增删改茶的效率能和平衡树相媲美 leecode1206 可以看上面的那个动画,动画效果很贴切。 我简单讲讲它的机制吧,每个节点不单单是一个,测试好几层,然后同一层的节点和统一节点的next 采用单链表产生联系 最核心的东西在于find 这也是为什么单链表的增删改查,花费开销最多的地方。 那它是怎么查的? 我们已经知道了跳表的结构了,最底层肯定是

Leecode热题100---94:二叉树的中序遍历

题目: 给定一个二叉树的根节点 root ,返回 它的 中序 遍历 。 递归思路: 中序遍历:中序遍历左子树,然后访问根,再中序遍历右子树; 切记:左子树为空或已遍历才可以访问根,然后中序遍历右子树!!! 递归算法实现: 若二叉树为空,则空操作,否则: 1、中序左子树—>2、访问根—>3、中序遍历右子树 C++: #include<iostream>#include<vector>us

Leecode热题100---560:和为k的子数组个数

题目: 给你一个整数数组 nums 和一个整数 k ,请你统计并返回 该数组中和为 k 的子数组的个数 。 子数组是数组中元素的连续非空序列。 C++: #include<iostream>#include<vector>using namespace std;class Solution{public:int number(vector<int>& nums, int k){int

Leecode热题100---11:盛最多水的容器

题目: 给定一个长度为 n 的整数数组 height 。有 n 条垂线,第 i 条线的两个端点是 (i, 0) 和 (i, height[i]) 。 找出其中的两条线,使得它们与 x 轴共同构成的容器可以容纳最多的水。 返回容器可以储存的最大水量。 说明:你不能倾斜容器。 C++:双指针解法 要点:指针每一次移动,都意味着排除掉了一个柱子,每次移动有可能会增大面积的那条边。 详细解释请参照:

Leecode热题100---283:移动零

**题目:**给定一个数组 nums,编写一个函数将所有 0 移动到数组的末尾,同时保持非零元素的相对顺序。 请注意 ,必须在不复制数组的情况下原地对数组进行操作。 C++: 1、常规思路: 先遍历一次,记录当前遍历到的非零元素的个数(若为第n个非0的元素,就将该非零至于数组中下标为n - 1的位置);在非零元素遍历完毕后,得到flag个非零元素。从第flag + 1个元素开始,剩余的元素全部置

leecode 378. 有序矩阵中第K小的元素

题目:leecode 378. 有序矩阵中第K小的元素 题目描述: 给定一个 n x n 矩阵,其中每行和每列元素均按升序排序,找到矩阵中第 k 小的元素。 请注意,它是排序后的第 k 小元素,而不是第 k 个不同的元素。 示例: matrix = [[ 1, 5, 9],[10, 11, 13],[12, 13, 15]],k = 8,返回 13。 提示: 你可以假设 k

leecode 32. 最长有效括号

题目描述: 给定一个只包含 ‘(’ 和 ‘)’ 的字符串,找出最长的包含有效括号的子串的长度。 示例 1: 输入: “(()” 输出: 2 解释: 最长有效括号子串为 “()” 示例 2: 输入: “)()())” 输出: 4 解释: 最长有效括号子串为 “()()” 解题思路: preLen 数组记录的是当前字符匹配的有效括号子串的左侧下标; 例如: “()(()())” 下标:

leecode 1032. Stream of Characters

1032. 字符流 按下述要求实现 StreamChecker 类: StreamChecker(words):构造函数,用给定的字词初始化数据结构。 query(letter):如果存在某些 k >= 1,可以用查询的最后 k个字符(按从旧到新顺序,包括刚刚查询的字母)拼写出给定字词表中的某一字词时,返回 true。否则,返回 false。 示例: StreamChecker strea

leecode 5. 最长回文子串 (马拉车算法)

题目:leecode 5. 最长回文子串 题目描述:给定一个字符串 s,找到 s 中最长的回文子串。你可以假设 s 的最大长度为 1000。 示例 1:输入: "babad"输出: "bab"**注意: "aba" 也是一个有效答案。** 示例 2:输入: "cbbd"输出: "bb" 可以参考博客 https://blog.csdn.net/the_star_is_at/

leecode 1022. Sum of Root To Leaf Binary Numbers

题目:Sum of Root To Leaf Binary Numbers 题目描述: Given a binary tree, each node has value 0 or 1. Each root-to-leaf path represents a binary number starting with the most significant bit. For example, if