![](https://img-blog.csdnimg.cn/20201014180756925.png?x-oss-process=image/resize,m_fixed,h_64,w_64)
LeetCode
江xiao河
这个作者很懒,什么都没留下…
展开
-
1237. 找出给定方程的正整数解
自己的解法也是基于二分,本以为会快很多,其实却很慢。和最快的答案不同的地方就在于自己时二维二分,而答案是对每一列分别二分。/* * // This is the custom function interface. * // You should not implement it, or speculate about its implementation * class CustomFu...原创 2019-10-31 21:26:21 · 179 阅读 · 0 评论 -
900. RLE 迭代器
思路:递归求解class RLEIterator {public: vector<int> dp; int len,lo; RLEIterator(vector<int> A) { len=A.size();lo=0; for(int i=0;i<len;i++)dp.push_back(A[i]); ...原创 2018-09-09 11:28:32 · 200 阅读 · 0 评论 -
901. 股票价格跨度
思路:迭代求解class StockSpanner {public: vector<int> v,dp; StockSpanner() { v.push_back(0x7fffffff); dp.push_back(1); } int next(int price) { v.push_back(p...原创 2018-09-09 11:30:14 · 365 阅读 · 0 评论 -
902. 最大为 N 的数字组合
思路:数学方法,先将数字存入numD,记录exp[i]=rank^i,dp[i]表示D中有几个数字小于num[i],vis[i]表示D中有数字等于num[i]class Solution {public: int atMostNGivenDigitSet(vector<string>& D, int N) { int sum=0,t=N,R=1,r...原创 2018-09-09 11:32:36 · 887 阅读 · 0 评论 -
974. 和可被 K 整除的子数组
//总体思路:动态规划/* 用sum[i]记录A[0]-A[i]的和,将余数的个数记录到v数组当中,如果某个余数的个数有k个,则对应的和是K的倍数的子数组的个数是k*(k-1)/2个。*/int subarraysDivByK(vector<int>& A, int K) { int cnt=0,sum=0; vector<int> v(K,0); f...原创 2019-01-13 20:39:38 · 345 阅读 · 0 评论 -
991. 坏了的计算器
思路:与其对X进行操作,不如转换思路,对Y进行操作,代码很简单,请看。class Solution { public static int brokenCalc(int X, int Y) { int cnt=0; while(X!=Y){ if(X>Y){ cnt+=X-Y; ...原创 2019-02-10 11:45:15 · 571 阅读 · 0 评论 -
1022. 可被 K 整除的最小整数
方法解析:本题采用模拟的方法,难点在于为什么模拟到K个1就可以停止模拟了呢?需要证明其中的循环特点。可以这样考虑,对于K来说,其余数至多有0到K-1共K个,如果K次尝试不成功的话,必然产生循环,后面的尝试就无用了。也可以用出现余数的次数来进行剪枝,如果是第二次出现相同的余数,则可终止循环。不过,这样剪枝的代价是增加了空间复杂度。代码如下:class Solution {public: ...原创 2019-03-26 22:50:45 · 214 阅读 · 0 评论 -
1021. 最佳观光组合
解题思路:暴力方法会超时,要将复杂度降到O(N),即一次遍历。首先令i=0;然后随着j往后遍历,要在这个过程中更新i的值。具体代码如下:class Solution {public: int maxScoreSightseeingPair(vector<int>& A) { int res=-1; int max_i=A[0]+0;...原创 2019-03-26 23:28:06 · 437 阅读 · 0 评论 -
1028. 负二进制转换
思路:采取从高位到低位的顺序,分别对每一个奇数位进行修复处理,通过例子分析,可以看成,当该奇数位为1时才需要修复,当其高位为0时,只需要将其高位置1即可。当其高位为1时,根据其更高位采用不同的方法。其更高位为1时,只需要同时将其高位和更高位置0即可;其更高位为0时,同时将其高位和更高位取反后,修复上溢,对其跟高位进行修复。代码如下:class Solution {public: vo...原创 2019-03-31 17:28:27 · 326 阅读 · 0 评论 -
1049. 最后一块石头的重量 II
问题可以转换为分成两堆,然后两堆之差的最小值为多少。我们可以将此问题化为01背包问题,共30个不到的物品,总的重量作为背包的大小,具体见代码。class Solution{public: int lastStoneWeightII(vector<int>& A){ //01背包问题 int sum = accumulate(A.beg...原创 2019-05-20 14:25:18 · 525 阅读 · 0 评论 -
5076. 字符串的最大公因子
class Solution {public: //类比辗转相除法 //gcd(a,b){return a%b==0?b:gcd(b,a%b);} string gcdOfStrings(string str1, string str2) { if(str1==str2)return str1; if(str1.size()<str2...原创 2019-06-04 15:43:59 · 277 阅读 · 0 评论 -
5077. 按列翻转得到最大值等行数
//统计该行出现的次数,然后有多少行的模式形同,模式相同分为两种情况,可能是反转后全为0或者全为1class Solution {public: int maxEqualRowsAfterFlips(vector<vector<int>>& matrix) { map<string,int> tmap; int...原创 2019-06-04 16:20:57 · 224 阅读 · 0 评论 -
1091. 二进制矩阵中的最短路径
BFS队列即可class Solution {public: int shortestPathBinaryMatrix(vector<vector<int>>& grid) { int m=grid.size()-1,n=grid[0].size()-1; int xx[8]={0,1,1,1,0,-1,-1,-1},y...原创 2019-06-16 17:23:23 · 367 阅读 · 0 评论 -
1103. 二叉树寻路
先用完全二叉树找到最初的路径,然后再分奇数和偶数行分别处理找到变换之后的数字。class Solution {public: vector<int> pathInZigZagTree(int label) { vector<int> v,ans; int len = 0; while((1<<len)&...原创 2019-06-30 14:50:03 · 243 阅读 · 0 评论 -
5214. 最长定差子序列
动态规划:用dp[i]表示以i结尾的数字的最长定差子序列的长度,由于数字的范围有限,所以采用数组和偏移来实现,也可以用map实现。class Solution {public: int longestSubsequence(vector<int>& arr, int difference) { vector<int> dp(20005,...原创 2019-10-06 16:31:38 · 241 阅读 · 0 评论 -
401. 二进制手表
典型回溯法。需要注意ss+(1<<step)<60,<<移位运算的优先级不如加法class Solution {public: int N=10; vector<string> ans; void solve(int step,int mm,int ss,int num,int cnt){ if(s...原创 2018-09-03 11:26:34 · 215 阅读 · 0 评论 -
51. N皇后
典型试探回溯法class Solution {public: vector<vector<int> > ans; vector<vector<string> > strans; vector<int> tmp; vector<bool> vis; bool confli...原创 2018-09-03 10:12:17 · 93 阅读 · 0 评论 -
893. 特殊等价字符串组
膜拜大神的简洁代码//某大神算法class Solution {public: int numSpecialEquivGroups(vector<string>& A) { unordered_map<string, int> mp; for(auto &s : A){ string e...原创 2018-08-26 13:22:50 · 681 阅读 · 0 评论 -
91. 解码方法
思路:class Solution {public: //dp方法,dp[i]表示前i个字母的有效解码的个数 int numDecodings(string s) { if (s.empty() || s[0] == '0') { return 0; } int dp[s.size() + 1]; ...原创 2018-08-27 11:10:58 · 488 阅读 · 0 评论 -
149. 直线上最多的点数
思路:先用map将输入的点去重(这里要自定义比较函数),然后对于每一个点,遍历其后面的每一个点,记录在一条直线上的点的数目,在记录的过程中维护最大值。 开始时在map的自定义比较函数上面卡了壳,为此还得到codeblock这种IDE调试才看的出来,用VS的话比较函数少了const照样能运行/** * Definition for a point. * struct Point...原创 2018-08-23 15:20:36 · 473 阅读 · 0 评论 -
67. 二进制求和
虽然自己也写对了,但是代码非常不简洁,还是答案的代码简洁,应该学习下//答案class Solution {public: string addBinary(string a, string b) { int len_a = a.length(); int len_b = b.length(); // 新建一个结果字符串,长度为a、b串中最长的一个加1...原创 2018-08-23 15:48:40 · 274 阅读 · 0 评论 -
43. 字符串相乘
思路:高精度典型算法,应注意到n1位*n2位,结果最大为n1+n2位,位数不够的话要去除前导0,如果结果为0,记得输出0class Solution {public: string multiply(string num1, string num2) { int n1=num1.size(),n2=num2.size(); vector<...原创 2018-08-23 16:20:32 · 383 阅读 · 0 评论 -
415. 字符串相加
思路:同字符串相乘等题目的思路是一致的,转换为int数组,然后模拟手算。共同点是都先假设结果是最大位数,然后最后输出的时候再去除前导0;class Solution {public: string addStrings(string num1, string num2) { int n1=num1.size(),n2=num2.size(),n=max(n...原创 2018-08-23 16:30:49 · 103 阅读 · 0 评论 -
765. 情侣牵手
思路:对于不满足条件的情侣,一次交换可以使前一对情侣坐到一起,交换一次。 具体实现:用rank数组记录和维护节点位置信息,rank[i]=j表示编号为i的元素在row数组中的位置是j.然后就是遍历交换了。具体看代码。#define couple(x) (x%2?(x-1):(x+1))class Solution {public: int minSwapsCouple...原创 2018-08-24 21:31:55 · 544 阅读 · 0 评论 -
841. 钥匙和房间
思路:标准图的DFS遍历方法,无需多说class Solution {public: void DFS(int r,vector<vector<int>>& rooms,vector<int>& vis){ for(int i=0;i<rooms[r].size();i++){ ...原创 2018-08-24 21:45:02 · 381 阅读 · 0 评论 -
6. Z字形变换
准确来说,这是一个数学题,辨认清楚各个元素在Z字形中的位置即可class Solution {public: string convert(string s, int numRows) { string ans; if(numRows==1)return s; int r=0; while(r<s.si...原创 2018-08-25 09:39:11 · 102 阅读 · 0 评论 -
131. 分割回文串
思路:首先构造dp数组,dp[i][j]表示i-j是回文串,然后DFS回溯法输出结果class Solution {public: vector<string> tmp; vector<vector<string>> ans; void DFS(int lo,int hi,vector<vector<int&...原创 2018-08-30 11:19:29 · 298 阅读 · 0 评论 -
897. 递增顺序查找树
垃圾翻译,毁我青春 原题为:Given a tree, rearrange the tree in in-order so that the leftmost node in the tree is now the root of the tree, and every node has no left child and only 1 right child. 居然给翻译成了:...原创 2018-09-02 12:21:48 · 717 阅读 · 0 评论 -
898. 子数组按位或操作
/*非常好的dp题目dp[i][j]表示A[i]|..|A[j]的值如果直接Dp的话,O(N^2),会超时注意到每一行最多有30个不同的值,所以存在大量的重复,如果每一行的值是在上一行的值之上进行更新,每一行的值的个数均小于30个,就可以保证复杂度是O(30N)第i行表示以i结尾的所有的连续子序列和的或值的个数,则第i+1行的值为i行的每一个结果与元素j或运算,再加上元素j本身。即:d...原创 2018-09-02 12:57:36 · 1438 阅读 · 0 评论 -
899. 有序队列
当k>1时,相当于冒泡排序,因为任意两个相邻数据都可以在头部交换顺序到尾部。/当k==1时,遍历所有可能结果class Solution {public: string orderlyQueue(string S, int K) { if (K>1){ sort(S.begin(),S.end()); ...原创 2018-09-02 13:12:29 · 500 阅读 · 0 评论 -
169. 求众数 && 229. 求众数 II
不限定时间复杂度的话,很多人会先排序,再遍历的方法来做。不限定空间复杂度的话,很多人会用hash表来做。那么,有了这两个限定,就只能用摩尔投票算法了。主元素问题典型解法。摩尔投票算法:时间复杂度O(n),空间复杂度O(1)169class Solution {public: int majorityElement(vector<int>& nums...原创 2018-09-02 19:02:34 · 574 阅读 · 0 评论 -
892. 三维形体的表面积
思路:不是特比容易用语言的描述,用图形描述比较方便,但无奈作图成本太高,直接看代码,也是容易理解的。class Solution {public: int surfaceArea(vector<vector<int>>& grid) { int cnt=0,n=grid.size(),cnt1=0,cnt2=0; if(...原创 2018-08-26 13:21:18 · 676 阅读 · 0 评论