
LeetCode
scut_salmon
这个作者很懒,什么都没留下…
展开
-
分享一个二分查找算法的trick
这里分享一个二分查找算法的trick,我们知道二分查找是对一个已经排序对数组进行二分搜索,初始化一个left和right,left和right表示上界和下界。在每次循环中求mid,并不断更新left或right,直到找到最终的mid但是二分查找有很多写法和细节,例如,while(left<=right){ int mid = (left+right)/2; if()...原创 2020-03-15 23:59:24 · 247 阅读 · 0 评论 -
309. Best Time to Buy and Sell Stock with Cooldown
https://leetcode.com/problems/best-time-to-buy-and-sell-stock-with-cooldown/1. 思路https://leetcode.com/problems/best-time-to-buy-and-sell-stock-with-cooldown/discuss/75928/Share-my-DP-solution-(B...原创 2019-07-06 10:42:04 · 201 阅读 · 0 评论 -
301. Remove Invalid Parentheses(深度优先搜索)
https://leetcode.com/problems/remove-invalid-parentheses/1. 思路用深度优先搜索的思路,遍历这个字符串,当出现“)”的个数多于“(”的个数时,开始删除之前遇到的“)”使之平衡。每次平衡之后继续往后遍历,直到结束。当出现“(”的个数多于“)”的个数时,不能直接删除之前遇到的“(”,这时把字符串reverse之后按照刚才的操作。...原创 2019-07-16 15:24:10 · 113 阅读 · 0 评论 -
437. Path Sum III
https://leetcode.com/problems/path-sum-iii/1. 思路采用自身递归,思路可以很清晰。给定root->val和目标sum值,可能的path sum有五种:若root->val == sum,则root->val本身是一个路径 不考虑root->val包含在path sum中,从root->left和root-&...原创 2019-07-16 21:44:52 · 188 阅读 · 0 评论 -
295. Find Median from Data Stream
1. 思路思路参考自Stefan大神。需要动态地知道数组中间的两个数的大小,优先队列正好在push一个数的时候可以动态地调整 数的位置,每次插入操作是O(logn)。考虑把当前插入的数分成两份,小的一份放在small队列里,大的一份放在large队列里。small是个最大堆,large是个最小堆,addnum时把收到的数先放到small,再把small中的最大数pop出来放到large。若...原创 2019-07-31 09:25:01 · 187 阅读 · 0 评论 -
406. Queue Reconstruction by Height
1. 思路本题可巧妙应用insert函数,如果熟悉insert函数,就会发现k刚好可以作为insert函数的参数,表明插入的位置。插入之前需要对从高到低进行排序。2. 代码注意排序的时候sort中的比较函数compare要声明为静态成员函数或全局函数,不能作为普通成员函数,否则会报错:invalid use of non-static member function因为:非静态...原创 2019-07-31 11:14:24 · 214 阅读 · 0 评论 -
gas station 证明解是存在的
本博客参考自discuss原题链接:https://leetcode.com/problems/gas-station/1. 思路若所有station的gas小于cost之和,则解一定存在 .证明如下:假设i使得下式最小,则解的位置应为i+1两部求证:首先(如该式不成立,i最小的假设不成立)其次gas[i+1]-cost[i+1]+...+gas[n-...原创 2019-08-16 21:04:12 · 349 阅读 · 0 评论 -
快排的稳定性思考
快速排序是一种in-place算法,主要有两步,三数中值排序和pivot插入。其写法比较经典,所以最好理解之后背下来三数中值排序相对简单,要注意三个数比较的顺序 void median(vector<int>& nums, int left, int right, int mid){ if(nums[left]>nums[mid]) swa...原创 2019-08-26 23:48:36 · 2260 阅读 · 0 评论 -
leetcode题解:324. Wiggle Sort II
https://leetcode.com/problems/wiggle-sort-ii/1. 解题思路参考自https://leetcode.com/problems/wiggle-sort-ii/discuss/77682/Step-by-step-explanation-of-index-mapping-in-Java先找出数组的中位数,然后for循环遍历数组,大于中位数的放...原创 2019-08-27 09:50:34 · 234 阅读 · 0 评论 -
289. Game of Life
https://leetcode.com/problems/game-of-life/1. 思路使用naive的解法遍历数组内的每个元素,但是改变in-place地改变每个位置的值后,就会影响后面位置的next generation判断。解决方法是把next generation结果放在二进制数的第二位,不影响当前的状态(0 1都存储在第1位),采用&1操作取得当前的状态,...原创 2019-08-27 23:00:11 · 182 阅读 · 0 评论 -
C++ 求组合数防止溢出
long long C(int N, int M) { long long sum = 1; for(int i=1;i<=M; i++) { sum=sum*(N-M+i)/i; } return sum;}从1开始除和乘,可以防止过早溢出和除法除不尽...原创 2019-08-30 18:06:27 · 1813 阅读 · 0 评论 -
矩形重叠问题
该题可暴力求解,直接看代码:#include<bits/stdc++.h>using namespace std;int main(){ int n; vector<int> x1, y1, x2, y2; cin>>n; int res=1; int input; for(int i=0; i<...原创 2019-08-31 17:43:18 · 941 阅读 · 0 评论 -
某一点绕另一点逆时针旋转90后的坐标
普适公式见博客https://blog.youkuaiyun.com/faithmy509/article/details/80235631令b=90得到x=x2-(y1-y2)y=y2+(x1-x2)考试时有个办法可以现场推一下,不用记:如图中两个全等三角形,可推导得到上面的公式...原创 2019-09-02 22:16:30 · 21374 阅读 · 0 评论 -
347. Top K Frequent Elements题解
1. 思路难点在于把时间复杂度降低到O(nlogn),考虑使用unordered map,先统计所有数出现的概率,再把unordered map reverse一下,得到每个频数对应的原整数。2.AC代码(16 ms, faster than96.39%ofC++)class Solution {public: vector<int> topKFre...原创 2019-07-13 12:48:59 · 140 阅读 · 0 评论 -
215. Kth Largest Element in an Array
https://leetcode.com/problems/kth-largest-element-in-an-array/1. 思路求第k大的数。如果先排序再取第k个数,时间复杂度O(nlogn),太naive采用快速排序的思路,每次遍历后返回pivot(快速排序中的专有名词)的位置,如果该位置不是k,则对新的更小的数组执行快速排序操作,依次类推,直到pivot的位置是k为止。...原创 2019-06-13 23:46:51 · 248 阅读 · 0 评论 -
494. Target Sum题解(DP法)
题目链接:https://leetcode.com/problems/target-sum/题解:首先转化问题:令取正的数为A,取负的数为B,则要求sum(A)-sum(B)=S,两边加上sum(A)+sum(B),得到sum(A)-sum(B)+sum(A)+sum(B)=S+sum(A)+sum(B),即2*sum(A)=S+sum(nums),原问题转化为子数组和问题,使子数组和...原创 2019-04-13 14:27:24 · 442 阅读 · 0 评论 -
416. Partition Equal Subset Sum题解(DP法)
https://leetcode.com/problems/partition-equal-subset-sum/题解子数组和问题,目标和为sum(nums)/2,思路类似https://blog.youkuaiyun.com/scut_salmon/article/details/89281406子数组和问题,若暴力求解,枚举数组每个元素是否加入,复杂度为2^n;考虑动态规划方法,即根据前n...原创 2019-04-13 15:41:29 · 373 阅读 · 0 评论 -
15. 3Sum题解
https://leetcode.com/problems/3sum/题解此题解法我参考了https://leetcode.com/problems/3sum/discuss/7402/Share-my-AC-C%2B%2B-solution-around-50ms-O(N*N)-with-explanation-and-comments,感觉比较容易理解。即遍历每个数,寻找另外两...原创 2019-04-14 19:55:50 · 254 阅读 · 0 评论 -
4. Median of Two Sorted Arrays
https://leetcode.com/problems/median-of-two-sorted-arrays/思路参考这个discuss:https://leetcode.com/problems/median-of-two-sorted-arrays/discuss/2481/Share-my-O(log(min(mn))-solution-with-explanation...原创 2019-05-05 16:20:35 · 130 阅读 · 0 评论 -
23. Merge k Sorted Lists
https://leetcode.com/problems/merge-k-sorted-lists/思路一个简单的思路是把k个数组两两相加,但这样会超时,所以采用分治算法。合并两个数组的复杂度是O(n)的话,总的复杂度应该是O(nlog k)AC代码# Definition for singly-linked list.# class ListNode(object):...原创 2019-05-09 09:53:16 · 116 阅读 · 0 评论 -
31. Next Permutation
https://leetcode.com/problems/next-permutation/思路思路比较常见:从最后一个元素开始遍历,若前一个元素比后一个元素还小,找到比该前一元素大的元素并替换之,替换位置后面的所有数再从小到大排序注意的细节找到比该前一元素大的元素,对立面应该是小于等于 if j == L-1 or nums[j+...原创 2019-05-09 10:19:46 · 168 阅读 · 0 评论 -
10. Regular Expression Matching
https://leetcode.com/problems/regular-expression-matching/思路https://leetcode.com/problems/regular-expression-matching/discuss/5651/Easy-DP-Java-Solution-with-detailed-Explanation对以p中的每个元素为结尾的子...原创 2019-05-06 19:27:40 · 198 阅读 · 0 评论 -
11. Container With Most Water
https://leetcode.com/problems/container-with-most-water/思路https://leetcode.com/problems/container-with-most-water/discuss/6100/Simple-and-clear-proofexplanation1. 以头尾两个柱子(指针)为baseline,‘贪婪地’移动两...原创 2019-05-06 20:06:42 · 125 阅读 · 0 评论 -
19. Remove Nth Node From End of List
思路本题关键在于do this in one pass,否则可以直接第一遍遍历求List的长度,再求n-th node from the start of list。首先假设List的长度是N,则移动N次后ListNode为none,以题中示例为例,n=2,N=5时,ListNode移动两次之后,还有三次ListNode为none,而我们需要去掉的数恰好就是从头开始移动三位之后的数。...原创 2019-05-07 09:39:21 · 143 阅读 · 0 评论 -
76. Minimum Window Substring
1. 思路要求时间复杂度为O(n),可以定义两个指针i,j,指针i从左向右移动,当找到所有的T时i停止,开始移动指针j,当j的下一次移动使得s[j:i+1]没有包含T时停止,最后判断找到的i+1-j长度是不是最小的,即找到所谓的最小窗口。想法很简单,关键是找到一个数据结构表达T有没有“找全”,并且判断是否找到T的元素。可以定义一个变量counter统计剩余需要找到的T中元素的个数,同...原创 2019-05-20 19:04:43 · 175 阅读 · 0 评论 -
48. Rotate Image
思路旋转矩形有特定的公式,不过这里要求不能使用多余的矩阵,所以要用另一种思路:先斜对角对折后横线对折。考虑横线对折比较方便,所以采用左丿对角线对折AC代码class Solution(object): def rotate(self, matrix): """ :type matrix: List[List[int]] :r...原创 2019-05-11 12:40:30 · 130 阅读 · 0 评论 -
148. Sort List
1. 思路归并排序。不采用递归,而是每次遍历时在某个单位长度内作归并排序,这个单位长度从2开始,一直增加到大于等于list长度停止,排序结束。所以进行了log(n)次遍历,总的复杂度为O(nlogn).2. 注意的细节编程过程中,采用模块化编程,先在主函数中写好自己的算法,思路尽量简洁,然后算法需要的模块再一点一点地用函数实现。归并排序函数中由于一开始少了第68行导致出错。...原创 2019-05-25 16:32:21 · 155 阅读 · 0 评论 -
394. Decode String题解(堆栈法)
题目链接https://leetcode.com/problems/decode-string/题解:在discussion看到不少堆栈解法,虽然很巧妙,但是不自己走一下流程,容易忽略一些细节,题目记得也不深刻。用堆栈法:首先接收数字,遇到'[',把数字和‘’推入栈中,将数字变量置为空,以便接收嵌套的数字;依次读入字母,与第二个元素连接,遇到']',将栈推出,保存到最终的res变量。需...原创 2019-04-11 23:47:38 · 224 阅读 · 0 评论