![](https://img-blog.csdnimg.cn/20201014180756928.png?x-oss-process=image/resize,m_fixed,h_64,w_64)
leetcode
pessiboy
头号混子,会点C++,会点python,会点java。
展开
-
floyd-习题(leetcode-743)
class Solution {public: int networkDelayTime(vector<vector<int>>& times, int n, int k) { //第一位维度就是:一个数组 //第二位:表明首,末点和权重 //初始化每一个点 vector<vector<int>> graph(n+1,vector<int>(n+1,1e9));.原创 2021-05-10 17:56:15 · 222 阅读 · 0 评论 -
leetcode-509. 斐波那契数
脑残题:不讲了。我觉得力扣的官方是希望我们去使用动态规划去进行解决。但是我偏不class Solution {public: int fib(int n) { if(n==0) return 0; else if(n==1) return 1; else return fib(n-1)+fib(n-2); }};...原创 2021-01-04 11:23:18 · 106 阅读 · 0 评论 -
leetcode-135. 分发糖果
题目的描述很简单,但是模拟的过程显得比较麻烦。现在就是分两次扫描。其实扫描的本质上是一样的。从后面比前面的评分高,那么直接糖果+1.class Solution {public: int candy(vector<int>& ratings) { //其实就是发糖果 //描述一下就是: //如果后面的人,评分更高,那么糖果+1 //如果后面的人,评分更低,那么糖果不变 //就是一个模拟的过程.原创 2020-12-24 13:50:35 · 73 阅读 · 0 评论 -
leetcode-746. 使用最小花费爬楼梯
其实这题很像是leetcode的64题,就是一个逆向的递推过程。可以不可以算是dfs呢?目标是到终点的最短路径,我们在上楼梯中,要么上两个,要么上一个。然后就开始一个递推的过程。最后要取一个最小值。因为最后一个点可能是从导数第二个台阶上来的,或者是倒数第一个台阶上来的。这也是dp问题中,关于边界的取值。要么你在dp开始的时候就要取一个边界的值,要么就在末尾取一个边界值。最后的一个点可以这么理解:假设我们计算出我一个学期的期末排名,但是最后一场考试我们全班都加上同样的分数,其实我们可以看看倒数第二场的成原创 2020-12-21 09:31:45 · 95 阅读 · 0 评论 -
leetcode-29. 两数相除
好像通过率比较低,因为在边界上面处理比较麻烦。特别是这个数据,一个需要去注意的数据题目的意思是:就是 不用乘除,取模这三种方式去计算出商,注意这个商保存的是的整数部分。听了讲解之后大概能明白意思。其实从本质上面来说还是使用了乘除,因为位运算替代了乘法的操作。假设我们的出书和被除数为x的y,我们计算出的结果为k。那么数学化的形式语言就为:x/y=k。但是次数并不能失去使用除法。我们间接去进行转化一下。=>x-k*y=0。但是此时还是使用到了乘法啊,这一再去进行转化,将答案k转化成二进制的形式.原创 2020-12-20 15:34:47 · 199 阅读 · 0 评论 -
leetcode-6. Z 字形变换
真的是一直不敢写的题目,就是空着一直都没有写,因为之前看答案觉得模拟起来很麻烦。可能是那时候我的代码能力还不太足以支持我写出细颗粒的语言吧。废话不多说,就是一个字符串的模拟。结合别的答案,自己也把写了一遍。稍微去进行一下。题目思路分析,以及代码编写:比如这一行图:其实就是划分成N真的一种序列,然后行读取的方式去进行读取。但是需要去找一点点的小规律。我们很容易发现,在同一列中,首元素和末尾元素索引的差值是n-1.那么同一行中,两个字母间隔是2*n-2。那么我们可以首先得出结论①。首末两行我们.原创 2020-12-18 13:22:08 · 71 阅读 · 0 评论 -
leetcode-389. 找不同
ascii码或者使用xor去做代码:class Solution {public: char findTheDifference(string s, string t) { //用ASCII码去做 // int sum=0; // for(auto i:t) sum+=i; // for(auto i:s) sum-=i; // return sum; //用xor去做 ch.原创 2020-12-18 10:30:03 · 71 阅读 · 0 评论 -
leetcode-714. 买卖股票的最佳时机含手续费
我之前做过好像类似的,我第一想法就是用到了散点。其实和之前的122几乎差不多但是增加手续费的操作。很多人都去使用dp去做。但是好像直接可以去使用贪心去做。就是一个贪婪的过程。每一步去的最好的。这个我用题目给的数据去进行解释:1 3 2 8 4 7每一次的费用2元在1买上来,我们可以在3去卖掉,但是此时费力不讨好。我们可以不去选择。现在再去王后面去转,发现8可以去卖掉。此时再去收取4,在7的时候去卖掉。我们去实行的策略如下:最低价买入,最高价卖出,但是如果此时(收入-fee)<=0,那么完全.原创 2020-12-17 12:50:15 · 107 阅读 · 0 评论 -
leetcode-205. 同构字符串
和我前面讲的双射一模一样,再次不再去进行赘述代码如下:class Solution {public: bool isIsomorphic(string s, string t) { //好像还是双射的感觉啊 unordered_map<char,char> st,ts; if(s.size()!=t.size()) return false; for(int i=0;i<s.size();i++){ .原创 2020-12-16 21:50:00 · 79 阅读 · 0 评论 -
leetcode-290. 单词规律
昨晚12.10分稍微看了一下题目的意思。感觉这不太像是简单题目的。就是模拟出这个规律比较难,但是看了力扣的题解就发现。如果抽取出题目的意思就会显得比较简单,就是让你模拟出 集合论中的双射**双射的满足:**让我们去判断字符串的每一个位置是否能构成一一对应的关系。可能有一点点绕,但是你就算不知道这个知识点,你去硬模拟,到最后还是应该去实现双射这个结论。双射:既要满足单射又要满足满射。字母和单词是否一一对应,即相同字母对应相同单词,且不同字母对应不同单词。不同字母对应不同单词,等价于相同单词对应相同字母.原创 2020-12-16 21:47:53 · 107 阅读 · 0 评论 -
leetcode-738. 单调递增的数字
思路:向前遍历,前一项大于后一项,前一项就减1,后面所有都变成9比如332:其实就是遍历一下这个过程332329299代码如下:class Solution {public: int monotoneIncreasingDigits(int N) { string num=to_string(N); int len=num.size(); for(int i=len-1;i>=0;i--){ if(nu.原创 2020-12-15 20:50:03 · 111 阅读 · 0 评论 -
leetcode-49. 字母异位词分组
算是一个小模拟:主要实现思路:其实从给定的数据就可以稍微去猜测一下做法:从这个给定的数据来看,那么每一组疑惑词的前映射(可能说这个词读者不太懂),比如第一行的三个异或词,其实算是aet的不同形式。那么我们可以去哈希表去进行映射。映射方式如下:unordered_map<string,vector < string >> heap;只要我们对每一次的去便利的时候,我们先去进行排序,然后排序后的答案放到映射数组当中去就行了。到时候吧用迭代器稍微处理一下。class So.原创 2020-12-14 08:27:14 · 112 阅读 · 0 评论 -
leetcode0-649. Dota2 参议院
有一点点像是博弈的过程,就像是打牌。题目大意:就是给你字符串,如果顺序靠前,那么我可以限制后面的人。比如我RD,当前的第一个字符是R,那么我可以束缚后面的D。一开始可能有点模拟不出来。但是稍微看了答案之后大概明白意思:分析如下:用队列去模拟出每一个字符串出现的位置,这样也像是模拟出了字符串的顺序。如果R在D之前,那么我可以弹出D。然后我同样去在队尾加入R,表示出R的优先级稍微高一点。如果重复了多次操作,我们不妨猜想一下如果R很多,那么我们在弹出D的时候,我们的R还是插入了队列的尾端。这更像..原创 2020-12-11 10:27:31 · 96 阅读 · 0 评论 -
leetcode-860. 柠檬水找零
直接看代码,我感觉更是一种策略:如果收到了5元的直接添加票子如果收到了10元的,那么10元的数量++,但是5元被找出了如果收到了20,那么可能是两种策略,可能是少了三张5元,或者少了一张10元,或者5元.但是判断20元的时候,不能通过里面的数组的值得,可以通过10元票面的数量去判断。class Solution {public: bool lemonadeChange(vector<int>& bills) { // 算是一个计算的过程 ..原创 2020-12-10 13:00:28 · 66 阅读 · 0 评论 -
leetcode-62. 不同路径
两种方式去解决。动态规划:表示是从(0,0)—>(m,n)的路径的条数。先时候递推的思路往上面去想象,如果当前点已经在终点了。那么可能从上边或者左边来的。那么一直往前面去递推,那么到最后递推到起点,那么就是i1||j1是,那么就是边界情况了。那么获得的关系式如下:代码如下:class Solution {public://动态规划,记录出总的目标。//从当前节点总代(0,0)--->(m,n) int uniquePaths(int m, int n) { ..原创 2020-12-09 22:53:12 · 110 阅读 · 0 评论 -
leetcode-54. 螺旋矩阵
看了我的螺旋矩阵的题目,直接一刀秒蛇形/螺旋矩阵的题目先贴上相关的题目:大家可以都去写一下题目来源题目链接pat1105 Spiral Matrix (25分)leetcode59. 螺旋矩阵 IIleetcode54. 螺旋矩阵代码如下:class Solution {public: vector<int> spiralOrder(vector<vector<int>>& matrix) {原创 2020-12-04 15:38:47 · 56 阅读 · 0 评论 -
pat-59. 螺旋矩阵 II
如何解决呢?用偏移量法:可能理解上有点小麻烦。力扣上面虽然很多关于题解的,但是我感觉边界性太强了。我不太推荐。怎么使用偏移量法呢?设置方向,螺旋数组是一个顺序的方向。我们定义一个偏移量,attention:这个和dfs的那么迷宫不太一样。顺序访问:右下左上。int dx[]={0,1,0,-1},dy[]={1,0,-1,0}.class Solution {public: vector<vector<int>> generateMatrix(int n) { .原创 2020-12-04 15:33:28 · 58 阅读 · 0 评论 -
leetcode-553. 最优除法
小模拟:说几个在做题目中的一个小要点:(1):分类讨论,注意边界,需要转化成string类型,用to_string()函数(2):注意一个可能多了一个 /。(3):如何取出vector中最后一个元素, (1)用erase函数,但是复杂度比较好,容易超时。注意一定要-1。不然超过的数组的范围 代码:res.erase(res.end()-1); (2) 通过pop_back()函数,而且直接去移出元素的时间复杂度是最低的 代码: res.pop_back(); 注意的返回值是void直接.原创 2020-11-22 22:27:25 · 397 阅读 · 0 评论 -
pat-554. 砖墙
解释:我们找出每一道的空袭,比如在上面我们可切出如下的空袭,然后我们记录在哈希表上面去。然后我们选取出点最多的那个空隙,选出他的对里面,然后就是刀刃碰到最小的次数代码如下:在保存坐标的时候,从起始点开始然后保存每个空袭的长度,然后依次往后面去进行相加,此放入和哈希表里面去。可能我说其实还是很乱很乱我做出一个解释,将上面的砖块做出一个投影,投影在x轴上面:(1,0)(3,0)(5,0)(3,0)(4,0)(1,0)(4,0)(2,0)(3,0)(4,0)(1,0)(4,0)(5,0)..原创 2020-11-22 21:58:23 · 331 阅读 · 0 评论 -
leetcode-559 N叉树的最大深度
二叉树的最大深度上面去进行一下转化,稍微去注意下,N叉树的孩子保存一个vector里面,对vector里面的元素去进行遍历即可。最后返回的高度一定要+1/*// Definition for a Node.class Node {public: int val; vector<Node*> children; Node() {} Node(int _val) { val = _val; } Node(int _val.原创 2020-11-22 21:17:08 · 87 阅读 · 0 评论 -
leetcode-有效的字母异位词
最笨的办法了:class Solution {public: bool isAnagram(string s, string t) { //排序后去进行比较 sort(s.begin(),s.end()); sort(t.begin(),t.end()); if(s==t) return true; else return false; }};...原创 2020-11-22 21:10:29 · 54 阅读 · 0 评论 -
leetcode-和为K的子数组
前缀和+哈希表。其实最终的部分是前缀和代码如下:class Solution {public: //前缀和+哈希 int subarraySum(vector<int>& nums, int k) { int n=nums.size(); vector<int> s(n+1); for(int i=1;i<=n;i++) s[i]=s[i-1]+nums[i-1]; unordere.原创 2020-11-22 21:08:38 · 73 阅读 · 0 评论 -
leetcode-540. 有序数组中的单一元素
异或操作,相同为0,不同为1;so easy代码如下:class Solution {public: int res; int singleNonDuplicate(vector<int>& nums) { //直接为位运算直接把一堆数去取出掉 for(int i=0;i<nums.size();i++){ res^=nums[i]; } return res; .原创 2020-11-19 18:51:48 · 73 阅读 · 0 评论 -
leetcode-283. 移动零
就是数组元素移动问题:代码如下:class Solution {public: void moveZeroes(vector<int>& nums) { int j=0; for(int i=0;i<nums.size();i++){ if(nums[i]!=0) nums[j++]=nums[i]; } while(j<nums.size()) nums[j++]=0;.原创 2020-11-19 13:18:46 · 60 阅读 · 0 评论 -
leetcode -1122. 数组的相对排序
哈希表处理,千万不要使用unordered_map否则测试点过不去。unordered故名思意的意思就是无序表。所以直接使用map就可以了class Solution {public: map<int,int> m;//不能用无序表,否则被排序了 vector<int> ans; //现在是不存在的数字也要记录下来 vector<int> relativeSortArray(vector<int>& arr1, v.原创 2020-11-14 14:31:45 · 92 阅读 · 0 评论 -
leetcode-1356. 根据数字二进制下 1 的数目排序
stl和lambda之美:class Solution {public: vector<int> sortByBits(vector<int>& arr) { sort(arr.begin(),arr.end(),[](auto a,auto b){ if(__builtin_popcount(a)!=__builtin_popcount(b)) return __builtin_popcount(a)<__buil.原创 2020-11-06 15:20:23 · 165 阅读 · 0 评论 -
leetcode-67 二进制求和
哈哈,这居然还是简单题,我一直一以为二进制加法很简单。但是还是和高精度加法一个叼情况class Solution {public: string addBinary(string a, string b) { //先去添加前导0 string res; reverse(a.begin(),a.end()),reverse(b.begin(),b.end()); int c=0; for(int i=0;i<a.原创 2020-11-04 22:47:59 · 68 阅读 · 0 评论 -
leetcode-57 插入区间
这里找一个配图去分析:分析:注意这里只是合并一个区间。1.就是按照上面这样:显然直接将蓝色的区间放到答案数组里2.如果这种情况排除后,那么此时while应该就是存在交集的部分,那么更新新的区间。类似于这样子。3.(请读清除题目,这里插入的仅仅是一个区间),那么后面的情况之后处理到边界情况就可以了。因为都是单调递增的不连续区间。代码如下:class Solution {public: vector<vector<int>> insert(vector&.原创 2020-11-04 09:08:36 · 67 阅读 · 0 评论 -
leetcode-1290 二进制链表转整数
就是一个链表的简单处理题目:我之前写过两数相加的链表表示:题目难度要大一点:但是这题也有我们学习的地方:比如位运算,栈,好像也有那么点秦九韶的味道:直接计算(秦九韶的感觉):/** * Definition for singly-linked list. * struct ListNode { * int val; * ListNode *next; * ListNode(int x) : val(x), next(NULL) {} * }; */class.原创 2020-11-03 22:54:55 · 76 阅读 · 0 评论 -
leetcode-122 买卖股票的最佳时机 II
我一开始还是想用dp的。但是你仔细读题目,你卖出之后还可以买入。那dp其实就没有什么用了。代码如下:class Solution {public: int maxProfit(vector<int>& prices) { //这可能都不算是dp只要存在差值,那么就去就行做差 //7 1 5 3 6 4 int ans=0; for(int i=1;i<prices.size();i++){ .原创 2020-11-03 22:27:21 · 38 阅读 · 0 评论 -
leetcode-121 买卖股票的最佳时机
我一开始以为这是简单题,我就直接暴力做法了。其实这道题目刚开始的时候暴力做法是可以去ac的,但是好像数据被加强了。双重循环好像不太可以了。暴力做法如下:class Solution {public: int maxProfit(vector<int>& prices) { int profit=0; for(int i=0;i<prices.size();i++){ for(int j=i+1;j<pri.原创 2020-11-03 22:22:40 · 80 阅读 · 0 评论 -
leetcode-56 合并区间
在做这道题目之前,请先去查看一下晴神的《算法笔记》,区间贪心那一快(122页),好像好像戳气球的题目也是区间贪心的问题。ps:在复习贪心问题的时候,尽量先去学一下sort的lambda表达式,真的蛮有用的,对一侧的区间进行排序。但是大佬非要自己用结构体手写,那我就不杠了。我贪心问题写得不对多,这算是我写得为数不多的贪心问题叭。大概分析一下:我们希望区间去进行合并1.首先先对区间的左端点去进行排序。请一定学一下lambda,自己写cmp其实也行吧这里插入一个图,非常的形象2.先去记录一个答案,.原创 2020-11-02 10:23:44 · 85 阅读 · 0 评论 -
leetcode-49 字母异位词分组
做题思路:就是希望讲字符相同,但是单词不同的单词进行一下归类。就是一个简单的哈希+字符串的使用:就是一个字符串,可能对多个结果。1.建立映射关系,一个字符串,对应多种结果2.我们每遍历一个数,就要去对数字继续排序,如果没有那就创建键值对,3.之后就是白能力,就哈希表的值,插入答案中class Solution {public: vector<vector<string>> ans; vector<vector<string>> .原创 2020-11-02 08:58:58 · 67 阅读 · 0 评论 -
leetcode -470 用 Rand7() 实现 Rand10()
算是数学问题:现在已经给你了一个rand7(),可以随机生成一个[1,7]的数字.现在在这个基础上面,生成随机数rand10()int a=rand();//1,2,3,4,5,6,7 但是这里面8,9,10表达不了int b=rand()*7;//7,14,21,28,35,42,49 这里结尾的有 1,2,3,5,7,8,9。还是不连续,而且缺少数字了int b=(rand()-1)*7;//7,14,21,28,35,42,49 这里结尾的有0,1,2,3,5,7,8。 还是不连续我.原创 2020-10-29 17:56:38 · 148 阅读 · 1 评论 -
leetcode- 462 最少移动次数使数组元素相等 II
刚看到这题,真的是数据很敏感,就是感觉是一个数学问题,而且是一个最优解的问题。我找了一些数据去验证了一下,发现我的想法真的是正确的:代码如下:class Solution {public: //使得整个数组的所有数相同,其实就是一个中位数 //比如1 2 3. //如果全部转化为1.那么那么就要转三次 //如果都是转成2,那么需要去转2次 //如果都是转成3,那也是要转成3次 //1 4 52 100 //如果选4的话3+48+96=14.原创 2020-10-29 17:00:40 · 169 阅读 · 0 评论 -
leetcode-371 两整数之和
不用想肯定是涉及位运算,而且肯定要有递归。因为不允许使用符号运算嘛分析:异或是一个不进位的计算:我们可以得到当前位加法后的值。异或:相同位0,不同为1那么递归计算即可。当前的值和左移动的最右一位相加,递归到底即可!代码如下:class Solution {public: int getSum(int a, int b) { //肯定就是位运算了,间接去+以下 //异或运算是一个不进位的加法,所以我们可以计算出每一位每一位的值 //我们可.原创 2020-10-27 08:56:38 · 70 阅读 · 0 评论 -
leetcode-1365 有多少小于当前数字的数字
直接暴力做法。当时刚开始还是想过使用排序+哈希的做法。class Solution {public: vector<int> smallerNumbersThanCurrent(vector<int>& nums) { //找出多少个索引类似于这样 //暴力做法 vector<int> res(nums.size(),0); for(int i=0;i<nums.size();i.原创 2020-10-26 08:22:07 · 64 阅读 · 0 评论 -
leetcode- 445 两数相加 II
分析:考察链表和进位制加法:1.首先要对链表进行翻转,要么用栈存储,要么就是用vector,随便你怎么实现,但是原理上还是需要你去进行进位制加法2.计算出来结果之后,然后还是把计算的结果,挂在链表上,进行返回ps:使用stack,vector去存储值的话,需要花费额外的O(n)的空间,肯定是比较浪费空间的。/** * Definition for singly-linked list. * struct ListNode { * int val; * ListNode *.原创 2020-10-22 22:37:41 · 71 阅读 · 0 评论 -
leetcode-137 只出现一次的数字 II
这一应该是让你设计一个电路准则,然后让三个相同数字进行操作,然后使其结果为0.代码如下:class Solution {public: int singleNumber(vector<int>& nums) { //就是算是设计一个东西,进行三次操作,可以抵消成为0 int a=0,b=0; for(auto x:nums){ b=(b^x)&~a; a=(a^x)&a.原创 2020-10-22 16:29:00 · 64 阅读 · 0 评论 -
leetcode-441 排列硬币
不多讲了,数学思维。我觉得这玩意用牛顿迭代也是可以的。class Solution {public: int arrangeCoins(int n) { //x(x+1)/2=n if(n==0) return 0; int res=0; //数列问题,稍微去转化一下,无非就是求出行数 for(long long i=1;i<=pow(2,16);i++){ if(i*(i+1)/2.原创 2020-10-21 09:59:41 · 835 阅读 · 0 评论