leetcode
leetcode
blhbay
这个作者很懒,什么都没留下…
展开
-
[LeetCode] 300 最长递增子序列 及返回这一子序列
在原题的基础上,维护一个pos数组,当更新dp时,保存当前节点 i 的前一个结点 j 的下标(因为dp[i]是需要dp[j]来推出的)。另外用max和lastPos分别保存最长递增子序列的最后一个(即最大)元素和下标,然后通过遍历pos数组,从后向前地把目标数组构造完成。#include<bits/stdc++.h>#include<sstream>#include<string>using namespace std;class Solution原创 2022-04-15 15:23:13 · 597 阅读 · 0 评论 -
[LeetCode] 394. 字符串解码
394. 字符串解码 - 力扣(LeetCode) (leetcode-cn.com)思路:借助两个栈,一个numStk存放数字,一个strStk存放字母或部分串。遍历过程中:如果s[i]为数字,更新当前遍历得数字;如果s[i]为字母,更新当前的部分串;如果s[i]为左括号“[”,则将当前遍历得到的数字、当前的部分串入栈;如果s[i]为右括号“]”,则根据numStk和strStk的两个栈顶元素,将strStk的栈顶元素合成一个新的子串,并且当前串更新为这个新的子串。当前串是从头原创 2022-04-08 19:48:23 · 518 阅读 · 0 评论 -
[LeetCode] 25. K个一组翻转链表
25. K 个一组翻转链表 - 力扣(LeetCode) (leetcode-cn.com)/** * Definition for singly-linked list. * struct ListNode { * int val; * ListNode *next; * ListNode() : val(0), next(nullptr) {} * ListNode(int x) : val(x), next(nullptr) {} * Lis原创 2022-04-08 17:22:57 · 316 阅读 · 0 评论 -
[LeetCode] 215. topK 数组中最大的第k个数
题目:给定整数数组 nums 和整数 k,请返回数组中第 k 个最大的元素。方法:1.完全排序,即快排时间复杂度:平均O(N*logN),最坏O(N^2)2.部分排序,STL中的std::partial_sort时间复杂度:最坏O(N*logK)3.快速选择时间复杂度:平均 O(N),最坏 O(N^2)4.BFPRT时间复杂度:平均 O(N),最坏 O(N)5.堆排序:小根堆vs大根堆6.二叉搜索树...原创 2022-04-04 14:59:03 · 537 阅读 · 0 评论 -
[LeetCode] 863 二叉树中所有距离为K的节点
863. 二叉树中所有距离为 K 的结点 - 力扣(LeetCode) (leetcode-cn.com)思想就是用dfs,不过要做一些额外的处理。1. 因为从target开始遍历,所以要单独存储节点之间的父子关系,可以用unordered_map。这道题里数字都不相同,所以当前节点的值作为key即可。从头遍历一遍树,存到哈希表中。2.从target开始的dfs,向三个方向深搜:左右孩子和父节点。可以设一个depth参数记录遍历深度,好作为终止条件。需要引入一个TreeNode* from参数记原创 2022-03-24 19:59:36 · 451 阅读 · 0 评论 -
[LeetCode] 543二叉树的直径 124二叉树中最大路径和
两道题都与二叉树中的路径有关,二叉树中的路径即树中两个点之间的连线,可能经过根节点,也可能不经过。可以这么理解路径:树中某一结点,该节点处于某条路径中,路径的其余部分可能在其左右子树中或其父节点中。两道题都需要设置函数外的变量记录当前最大值。都可以用dfs来解决。543题中求最长路径,需要找到两个点,这两个点之间的路径长度最大,注意路径长度是这两个点之间点数(包括头尾)-1。dfs中:先求左右孩子到叶节点的长度,可知返回值应该是左右较大值+1,判断则是1+左+右/** * Definit原创 2022-03-22 10:29:46 · 350 阅读 · 0 评论 -
[LeetCode] 原地哈希
原理:将数组元素nums[i]的值作为下标,即nums[nums[i] - 1]适用:可以使用哈希表完成,但限制空间复杂度O(1),且数组元素和数组下标(0 ~ n-1或 1 ~ n)有关287. 寻找重复数 - 力扣(LeetCode) (leetcode-cn.com)思路:不断把nums[i]与nums[nums[i] - 1]进行比较,如果不等则把nums[i]放在nums[i]-1位置,如果相等则找到了。即,1放在0的位置,2放在1的位置...class Solution {p原创 2022-03-12 15:52:14 · 321 阅读 · 0 评论 -
[LeetCode] 297 二叉树的序列化与反序列化
297. 二叉树的序列化与反序列化 - 力扣(LeetCode) (leetcode-cn.com)题意:给定二叉树,将各个结点值转化为字符串(包括中间的空结点,记为“None”);给定序列化字符串,转化为对应的二叉树。注意:序列化时对树的遍历顺序,要与反序列化时建树的顺序保持一致。反序列化:首先要按照逗号进行分割,分割为多个字符串,使用list进行存储,建树时每建好一个结点,则list去掉一个头元素。/** * Definition for a binary tree node. *原创 2022-03-10 20:22:46 · 240 阅读 · 0 评论 -
[LeetCode] 48 旋转图像
48. 旋转图像 - 力扣(LeetCode) (leetcode-cn.com)要求将一个正方形矩阵顺时针旋转90°,且要求原地操作,即直接修改,空间复杂度O(1)。思路:先沿对角线翻转,再水平翻转一次即可。可知:(i, j)关于对角线对称的坐标为(j, i),而关于竖直对称轴对称的坐标为(i, n - j - 1),n为边长。class Solution {public: void rotate(vector<vector<int>>& m原创 2022-03-10 19:39:57 · 149 阅读 · 0 评论 -
[LeetCode] 32 最长有效括号
32. 最长有效括号 - 力扣(LeetCode) (leetcode-cn.com)动态规划:dp[i]表示以i为结尾的最长有效括号子串的长度。参考题解如下:class Solution {public: int longestValidParentheses(string s) { //dp[i]为以i为末尾的最长有效括号子串的长度 vector<int> dp(s.size(), 0); ...原创 2022-03-09 10:47:30 · 415 阅读 · 0 评论 -
[LeetCode] 50 Pow(x,n) x的n次幂
50. Pow(x, n) - 力扣(LeetCode) (leetcode-cn.com)思路:快速幂递归方法:class Solution {private: double quickMul(double x, long long N) { if(N == 0) return 1.0; double y = quickMul(x, N/2); //先计算N一半次幂 return N % 2 == 0 ? y * y : y.原创 2022-03-08 21:26:36 · 113 阅读 · 0 评论 -
[LeetCode] 125 验证回文串
125. 验证回文串 - 力扣(LeetCode) (leetcode-cn.com)两个有用的函数:isalnum(); 判断字符是否为字母或数字,是则返回true,否则返回falsetolower(); 将大写字母字符转换为小写字母toupper(); 小写转大写题目思路:方法1:准备一个新字符串,其中存储的是修改后的原串(只保留字母和数字,且大小写统一),然后双指针遍历。方法2:直接在原串上遍历,每次比较前先让两个指针遍历...原创 2022-03-08 09:16:16 · 7499 阅读 · 0 评论 -
[LeetCode] 468 验证IP地址
468. 验证IP地址 - 力扣(LeetCode) (leetcode-cn.com)思路:最重要的是构建自己的split函数,按照某个符号进行分割,split函数定义如下: vector<string> split(string s, char c) { vector<string> ans; int l = 0; //寻找分割字符,已分割字符的位置作为子段的末尾位置进行分割 for(int r =原创 2022-03-07 15:39:42 · 121 阅读 · 0 评论 -
[LeetCode] 543 二叉树的直径
543. 二叉树的直径 - 力扣(LeetCode) (leetcode-cn.com)首先我们知道一条路径的长度为该路径经过的节点数减一,所以求直径(即求路径长度的最大值)等效于求路径经过节点数的最大值减一。而任意一条路径均可以被看作由某个节点为起点,从其左儿子和右儿子向下遍历的路径拼接得到。用递归来计算左右孩子向下遍历的深度。/** * Definition for a binary tree node. * struct TreeNode { * int val; *原创 2022-03-24 19:51:03 · 183 阅读 · 0 评论 -
常见排序:快排、堆排;快速选择
912. 排序数组 - 力扣(LeetCode) (leetcode-cn.com)快速排序原理:随机选取一个元素作为pivot,对其左右进行划分,并对新的到的部分重复上述操作。最后得到的就是有序数列。划分partition:对于左右边界分别为l和r的子数组,设置两个指针i和j,初始i=l-1,j=l。指针i和j维护一个子数组中的划分:i以及i左侧的元素均<=pivot;i+1至j的元素则均>pivot,j后的元素还未遍历。 对于i到j的子数组,首先随机选取一个元素作为主元pi原创 2022-03-03 21:02:25 · 501 阅读 · 0 评论 -
[LeetCode] 滑动窗口
3. 无重复字符的最长子串 - 力扣(LeetCode) (leetcode-cn.com)设置两个指针l,r。l和r分别指向子串的首尾元素。l从0开始且基于l进行for循环,r从-1开始且在for循环中利用while对r进行遍历。注意:l移动后说明l-1已经退出窗口了,因此要在set中清除l-1;while循环中遍历的实际上是r+1,这样当r+1为重复元素时,保存的r即为符合要求的窗口右边界class Solution {public: int lengthOfLongestSub原创 2022-03-03 14:48:02 · 175 阅读 · 0 评论 -
[LeetCode] 拓扑排序
(47条消息) 拓扑排序(Topological Sorting)_神奕的专栏-CSDN博客_拓扑排序拓扑排序的原理如上。简单的来说就是:对于有向无环图DAG来说,图内无环才能有对应的拓扑排序。LeetCode207 课程表207. 课程表 - 力扣(LeetCode) (leetcode-cn.com)拓扑排序+DFS:class Solution {private: vector<vector<int>> edges; //edges[i]原创 2022-03-02 17:30:36 · 207 阅读 · 0 评论 -
[LeetCode] 486.预测赢家
好几种方法:记忆化递归、动态规划、极小化极大minmax动态规划方法:1.设计dp数组:dp[i][j]中i和j用于表示当前数组的范围,dp[i][j]存放的是两个玩家都想要取胜则两者的分数差值。2.状态转移:(i,j)由(i+1,j)和(i,j-1)推出,dp[i][j] = max( (nums[i] - dp[i+1][j]), (nums[j] - dp[i][j-1])).3.初始化:从最后一步考虑,当数组只有一个数值时,对应的那个玩家必须那这个数字,这一步对应i==j,因此初..原创 2022-03-02 11:44:46 · 119 阅读 · 0 评论 -
[LeetCode] 146.LRU缓存
题目思路:模拟LRU缓存的原理。需要实现的内容:实现一个LRUcache类,其中包括两个方法,get方法相当于调取元素,经过get后的元素要更新位置到最前面;put方法为放入新元素,如果之前缓存没有这个元素,则新建元素并放入(如果放入之前缓存已满,就要淘汰最近最久没用的元素,即最后面的元素),如果之前缓存中就有,那就相当于执行get方法。实现的方法:利用双向链表和哈希表。其中双向链表的头尾均设置哑节点,便于操作。双向链表结点的定义://双向链表节点struct DlinkedNode {原创 2022-03-01 16:08:01 · 232 阅读 · 0 评论 -
[LeetCode] 200岛屿数量(DFS BFS) + 695岛屿最大面积(DFS)
1.深度优先DFS:遍历二维数组时遇到1,则说明遇到一个岛,岛数+1,dfs遍历后岛置为0class Solution {private: //dfs结束后该岛屿已全部置为0 void dfs(vector<vector<char>>& grid, int r,int c) { //r c为开始遍历的1的坐标 int rn = grid.size(); //grid行数 int cn = grid[0].size();原创 2021-12-13 17:25:53 · 279 阅读 · 0 评论 -
[LeetCode] 买卖股票
先放一个题解合集:https://leetcode-cn.com/circle/article/qiAgHn/121题 买卖股票的最佳时机1.暴力思路:两层循环,遍历所有可能的收益,时间复杂度O(n²)。2.官方题解思路:在某一天能够获得的最大收益,自然是用这天的股票价格 减去 历史上股票的最低价格。因此设置变量minPrice来记录历史上最低价格,同时要注意交易必然发生在这个最低价格出现之后,所以循环中先更新最大收益值,再更新历史最低价格。class Solution {public:原创 2021-12-02 21:27:23 · 205 阅读 · 0 评论 -
[LeetCode] 566 重塑矩阵
思路:二维数组与一维数组的坐标对应二维数组:m行n列,其中某元素处于i行j列。将其映射于一维数组,则一维数组中的序号x = i * n + j。反过来,一维数组中序号为x的元素,在对应的m行n列二维数组中坐标应为i = x / n,j = x % n。...原创 2021-11-10 20:27:23 · 300 阅读 · 0 评论 -
[Leetcode] 65 有效数字 / C++正则表达式使用
题目:参考评论中的正则解法:class Solution {public: //正则表达式解法 static const regex pattern; bool isNumber(string s) { return regex_match(s,pattern); }};//正则表达式作为类的静态变量或全局变量,避免重复构造的开销const regex Solution::pattern("[+-]?(\\d+\\.\\d+|\原创 2021-06-17 11:37:55 · 169 阅读 · 0 评论 -
[LeetCode] 5 最长回文子串
方法一:动态规划如果一个下标从i到j的子串(p[i,j])是回文串,那去掉其首尾的串p[i+1,j-1]也是回文串,不断回溯得到边界情况:串长为2和串长为1的子串必为回文串。内层循环为移动子串左边界并判断是否为回文,外层循环控制子串的长度。状态转移:p[i,j]为回文 = p[i+1,j-1]为回文 且 元素i==元素j 。边界条件:子串长为1;子串长为2 且 其中两个元素相同。class Solution {public: string longestPalindrome(..原创 2021-06-10 10:52:42 · 86 阅读 · 0 评论 -
随机算法
Fisher-Yates算法是一个用来将一个有限集合生成一个随机排列的算法(数组随机排序)。这个算法生成的随机排列是等概率的,同时这个算法非常高效。算法步骤:1.写下从 1 到 N 的数字2.取一个从 1 到剩下的数字(包括这个数字)的随机数 k3.从低位开始,得到第 k 个数字(这个数字还没有被取出),把它写在独立的一个列表的最后一位4.重复第 2 步,直到所有的数字都被取出5.第 3 步写出的这个序列,现在就是原始数字的随机排列// 反向或者正向洗牌效果相同。// 给定有限个数字原创 2021-03-20 22:08:47 · 1295 阅读 · 0 评论