力扣Leetcode
刷题
Charles6665
这个作者很懒,什么都没留下…
展开
专栏收录文章
- 默认排序
- 最新发布
- 最早发布
- 最多阅读
- 最少阅读
-
5538. 统计子树中城市之间最大距离
传送门解题思路:枚举子集,每次枚举都先判断是否可以相互到达。主要是判断方法:若a,b,c,d,e,…,z可以相互到达,那么必存在一个点,去除这个点后剩下点可以相互到达,且这个点与剩下的这些点中至少一个相连接。class Solution {public: bool vis[20][20]; int dis[20][20]; int sum[20]; int dp[(1<<15)+10]; void check(vector<int>原创 2020-10-11 17:26:52 · 307 阅读 · 0 评论 -
5514. 检查字符串是否可以通过排序子字符串得到另一个字符串
给你两个字符串 s 和 t ,请你通过若干次以下操作将字符串 s 转化成字符串 t :选择 s 中一个 非空 子字符串并将它包含的字符就地 升序 排序。比方说,对下划线所示的子字符串进行操作可以由 “14234” 得到 “12344” 。如果可以将字符串 s 变成 t ,返回 true 。否则,返回 false 。一个 子字符串 定义为一个字符串中连续的若干字符。解题思路:参考大佬的思路:我们可以发现任意两个数a[i],a[j],若a[i]<aj,无论怎么变,a[i]都不能到a[j]后去原创 2020-09-13 21:47:28 · 394 阅读 · 0 评论 -
LCP 15:秋叶收藏集(动态规划||前缀和)
小扣出去秋游,途中收集了一些红叶和黄叶,他利用这些叶子初步整理了一份秋叶收藏集 leaves, 字符串 leaves 仅包含小写字符 r 和 y, 其中字符 r 表示一片红叶,字符 y 表示一片黄叶。出于美观整齐的考虑,小扣想要将收藏集中树叶的排列调整成「红、黄、红」三部分。每部分树叶数量可以不相等,但均需大于等于 1。每次调整操作,小扣可以将一片红叶替换成黄叶或者将一片黄叶替换成红叶。请问小扣最少需要多少次调整操作才能将秋叶收藏集调整完毕。示例 1:输入:leaves = “rrryyyrryyyr原创 2020-09-13 21:33:32 · 326 阅读 · 0 评论 -
306-累加数
累加数是一个字符串,组成它的数字可以形成累加序列。一个有效的累加序列必须至少包含 3 个数。除了最开始的两个数以外,字符串中的其他数都等于它之前两个数相加的和。给定一个只包含数字 ‘0’-‘9’ 的字符串,编写一个算法来判断给定输入是否是累加数。说明: 累加序列里的数不会以 0 开头,所以不会出现 1, 2, 03 或者 1, 02, 3 的情况。示例 1:输入: “112358”输出: true解释: 累加序列为: 1, 1, 2, 3, 5, 8 。1 + 1 = 2, 1 + 2 = 3原创 2020-09-11 12:52:26 · 294 阅读 · 0 评论 -
10.正则表达式
给你一个字符串 s 和一个字符规律 p,请你来实现一个支持 ‘.’ 和 ‘*’ 的正则表达式匹配。‘.’ 匹配任意单个字符‘*’ 匹配零个或多个前面的那一个元素所谓匹配,是要涵盖 整个 字符串 s的,而不是部分字符串。说明:s 可能为空,且只包含从 a-z 的小写字母。p 可能为空,且只包含从 a-z 的小写字母,以及字符 . 和 *。示例 1:输入:s = “aa”p = “a”输出: false解释: “a” 无法匹配 “aa” 整个字符串。示例 2:输入:s = “aa”原创 2020-09-08 21:59:23 · 498 阅读 · 0 评论 -
组合
给定两个整数 n 和 k,返回 1 … n 中所有可能的 k 个数的组合。示例:输入: n = 4, k = 2输出:[[2,4],[3,4],[2,3],[1,2],[1,3],[1,4],]解题思路:一开始虽然知道是暴搜,但是由于在每次dfs过程中都用了一个for循环控制搜索,结果会导致有重复,其实只需要每次dfs过程中枚举当前这位选还是不选即可。class Solution {public: vector<vector<int>> p;原创 2020-09-08 21:38:33 · 170 阅读 · 0 评论 -
前k高频元素
给定一个非空的整数数组,返回其中出现频率前 k 高的元素。传送门你可以假设给定的 k 总是合理的,且 1 ≤ k ≤ 数组中不相同的元素的个数。你的算法的时间复杂度必须优于 O(n log n) , n 是数组的大小。题目数据保证答案唯一,换句话说,数组中前 k 个高频元素的集合是唯一的。你可以按任意顺序返回答案。思路:按照大佬思路:用最小堆,将堆内元素个数维护成k,每次加入元素的出现次数与最小堆堆顶比较,若大于则将堆顶元素出堆,加入该元素。class Solution {public:原创 2020-09-07 13:14:24 · 237 阅读 · 0 评论 -
预测赢家(博弈论,动态规划)
思路:动态规划:这里我们定义dp[i][j]为[i,j]中玩家1比玩家2最多能获得的分数.首先直观可知dp[i][i]=nums[i].[i,j]区间内玩家有两种操作方式:1.先拿nums[j],玩家1获得了nums[j].此时dp[i][j-1]就是玩家2比玩家1最多能获得的分数,此时玩家1比玩家2最多能获得的分数就是nums[j]-dp[i][j-1]2.先拿nums[i],玩家1获得了nums[i].此时dp[i+1][j]就是玩家2比玩家1最多能获得的分数,此时玩家1比玩家2最多能获得的分.原创 2020-09-01 10:00:26 · 1038 阅读 · 0 评论 -
马拉车算法模板
最近遇到几道回文字符串的题目都不太记得,来记录一下。首先我们需要预处理字符串例如abba,我们需要处理为:@#a#b#b#a# int init(string& s) { str="@#"; for(int i=0;i<s.size();++i) { str+=s[i]; str+='#'; } return str.size();//返回处理后的原创 2020-08-29 11:08:26 · 267 阅读 · 0 评论 -
查找大小为M的最新分组
解题思路:参照大佬的题解,每次添加的时候一共有三种情况1.左右都为空2.左为空或者右为空3.左右都不为空接着跟新link数组即可class Solution {public: int maxz; int findLatestStep(vector<int>& arr, int m) { maxz=arr.size(); vector<int> g(maxz+3,1); int ans=-1; .原创 2020-08-28 20:27:29 · 244 阅读 · 0 评论 -
得到目标数组的最少函数调用次数
把每个数看成二进制数,每位的1都是由操作1而得来的,故我们可以统计每位上1的数量来计算操作一的次数,操作二的次数为最大数所需要的右移次数class Solution {public: int minOperations(vector<int>& nums) { int maxz=0; int ans=0; for(auto u:nums) { int h=0; .原创 2020-08-23 21:07:42 · 231 阅读 · 0 评论 -
寻宝
思路分析:首先如果有M存在的话:最短路径一定是:S-O-M-O-M-…-T当没有M存在的话,即S-T的最短路径,可以BFS来S-T的最短距离当没有M存在的话,考虑最简单的情况,即不需要搬石头的情况,就是状压dp类似最短哈曼顿路径来求经S-T的最短距离,即首先DFS求出每个M到达其他M即起点终点的距离,dp[i][j]表示当前到达的点情况为i处于j点的情况,状压dp求解。再考虑更复杂的需要取石块的情况,即需要加一步(每个石块堆到达每个M点的距离),这样求出后我们可以预处理出两个M点之间的最短距离,这.原创 2020-07-29 14:32:46 · 379 阅读 · 0 评论 -
85.最大矩阵
思路:有点类似于之前做过的最大正方形面积,维护l[i][j]维护以(i,j)为末尾的横向1的长度,r[i][j]维护i,j结尾的纵向1的长度。class Solution {public: int maximalRectangle(vector<vector<char>>& matrix) { int n=matrix.size(); if(n==0) return 0; int m=matrix[0].size(.原创 2020-07-28 08:25:33 · 426 阅读 · 0 评论 -
329.矩阵中最长的递增路径
思路:1:记忆化搜索:由于路径可以保证前一个节点一定小于后一个节点,故不可能产生重叠情况,故采用记忆化搜索即可。2.拓扑排序,把该图看为有向图,相邻的两个节点中,其较小的顶点有一条边指向较大顶点,故可以采用拓扑排序来做。class Solution {//记忆化搜索public: int dx[4]={1,-1,0,0}; int dy[4]={0,0,1,-1}; int Dfs(vector<vector<int>>& matrix,ve.原创 2020-07-26 09:19:09 · 159 阅读 · 0 评论 -
95.不同的二叉搜索树
思路:一开始是暴力回溯,后面看大佬题解发现其实可以分治来做,对于(l,n)区间,取i为根节点,我们可以首先求解(l,i-1)和(i+1,r)子问题,再左右组合得到(l,n)区间的组合。/** * Definition for a binary tree node. * struct TreeNode { * int val; * TreeNode *left; * TreeNode *right; * TreeNode() : val(0), left(nul.原创 2020-07-21 09:45:36 · 177 阅读 · 0 评论 -
1424.对角线遍历 II
思路:可以发现每条对角线上元素,横坐标加纵坐标的和相等,且和越小的先被遍历,所以我们可以按照x+y去分类,开一个二维数组ans[ i ] [ j ],i表示(x+y),然后正常遍历这个nums,每遍历到一个元素,看看它的x+y,把它丢到ans[x+y]中。由于我们是从左到右从上到下遍历nums的,所以答案是反过来的,最后再reverse一下就行了。class Solution {public: vector<int> findDiagonalOrder(vector<vec.原创 2020-07-20 12:24:03 · 310 阅读 · 0 评论 -
Leetcode 1494并行课程
思路:状压dp,dp[i]表示上i中课程的最小学期,同时需要预处理每个i保存几个1,预处理每个课程的前缀课程。class Solution {public: int minNumberOfSemesters(int n, vector<vector<int>>& dependencies, int k) { vector<int> c((1<<15)+1,0); for(int i=0;i<(1.原创 2020-07-17 21:57:50 · 731 阅读 · 0 评论 -
Leetcode 47全排列
给定一个可包含重复数字的序列,返回所有不重复的全排列。示例:输入: [1,1,2]输出:[[1,1,2],[1,2,1],[2,1,1]]思路:这题主要是考察如何剪枝去重,正确思路应该为:首先排序,递归的过程中如果目前将要加入的数的前一个与该数相同且未加入,则可以停止了。class Solution {public: bool vis[100086]; unordered_map<int,int> p; void Find(vector<vec原创 2020-07-17 21:36:16 · 237 阅读 · 0 评论 -
Leetcode 1509.三次操作后最大值与最小值的最小差
给你一个数组 nums ,每次操作你可以选择 nums 中的任意一个元素并将它改成任意值。请你返回三次操作后, nums 中最大值与最小值的差的最小值。示例 1:输入:nums = [5,3,2,4]输出:0解释:将数组 [5,3,2,4] 变成 [2,2,2,2].最大值与最小值的差为 2-2 = 0 。示例 2:输入:nums = [1,5,0,10,14]输出:1解释:将数组 [1,5,0,10,14] 变成 [1,1,0,1,1] 。最大值与最小值的差为 1-0 = 1 。示原创 2020-07-15 21:48:13 · 569 阅读 · 0 评论 -
90.不同的二叉搜索树
思路:动态规划,dp[i]表示总节点数为i时候的全部情况数,当以k点为根节点,则其左侧有k-1个点,右侧有n-k个点,dp[n]=dp[0]*dp[n-1]+dp[1]*dp[n-2]+。。。+dp[n-1]*dp[0]原创 2020-07-15 09:37:21 · 202 阅读 · 0 评论 -
串联所有的单词字串(力扣30)
给定一个字符串 s 和一些长度相同的单词 words。找出 s 中恰好可以由 words 中所有单词串联形成的子串的起始位置。注意子串要与 words 中的单词完全匹配,中间不能有其他字符,但不需要考虑 words 中单词串联的顺序。示例 1:输入:s = “barfoothefoobarman”,words = [“foo”,“bar”]输出:[0,9]解释:从索引 0 和 9 开始的子串分别是 “barfoo” 和 “foobar” 。输出的顺序不重要, [9,0] 也是有效答案。示原创 2020-07-13 21:54:56 · 422 阅读 · 0 评论 -
第K大数(nth_element用法)
默认从小到大第k小数nth_element(arr,arr+(k-1),arr+len);从大到小第k大数nth_element(arr,arr+(k-1),arr+len,greater());#include<bits/stdc++.h>using namespace std;int main(){ int arr[10]={2,8,4,3,7,9,10,1,5,6}; nth_element(arr,arr+5,arr+10);//第6小数 cout<<.原创 2020-06-29 08:36:03 · 385 阅读 · 0 评论 -
29-两数相除
给定两个整数,被除数 dividend 和除数 divisor。将两数相除,要求不使用乘法、除法和 mod 运算符。返回被除数 dividend 除以除数 divisor 得到的商。整数除法的结果应当截去(truncate)其小数部分,例如:truncate(8.345) = 8 以及 truncate(-2.7335) = -2链接:https://leetcode-cn.com/problems/divide-two-integers思路:采用递归求解,注意开long longclass So原创 2020-06-27 10:55:04 · 300 阅读 · 0 评论
分享