LeetCode
文章平均质量分 55
mazhichao300
这个作者很懒,什么都没留下…
展开
-
Divide Two Integers
不能用乘除取模做除法。思路:现在只有加减,位运算可以使用。 主要是用减法来实现除法:统计被除数可以减多少次除数。利用2分思想降低时间复杂度。再稍作边界条件判断,代码如下:public class Solution { public int div(long dividend, long divisor, long currentDivisor, long times) { i原创 2013-05-17 11:51:35 · 381 阅读 · 0 评论 -
Median of Two Sorted Arrays
解析在这里:http://blog.csdn.net/mazhichao300/article/details/9714291 稍有不同,解析处是针对于求中间元素。而本题可以求第K个元素。 class Solution {public: int findMedian(int *a, int lena, int *b, int lenb, int median) {原创 2013-08-02 14:57:14 · 453 阅读 · 0 评论 -
Trapping Rain Water
class Solution {public: int trap(int A[], int n) { // Start typing your C/C++ solution below // DO NOT write int main() function int *leftMax = new int[n + 5]; int原创 2013-08-06 10:49:11 · 493 阅读 · 0 评论 -
Longest Substring Without Repeating Characters
解题思路:两个指针,开始都指向字符串起始位置, 然后指针2向后遍历直至从pos1到pos2的子串出现重复字符,这时pos1开始自增,直至从pos1到pos2没有重复字符。也就是遍历2遍,复杂度O(n)。class Solution {public: int lengthOfLongestSubstring(string s) { // Start typing y原创 2013-08-06 11:24:28 · 453 阅读 · 0 评论 -
Surrounded Regions
BFS,开一个二维数组标记board中的元素是不是被访问过(初始化为false)。 然后从board边界处的'O'开始BFS,访问到的标记为true。最后遍历标记数组,把未访问过的O改为X。class Solution { public: void solve(vector> &board) { // Start typing your Java solution原创 2013-08-06 19:43:04 · 466 阅读 · 0 评论 -
Longest Consecutive Sequence
用set,注意当遍历set后,要把对应的值从set中清除掉,这样会大大减小复杂度。用unordered_set时间会更快,后面了解下set 和 unordered_set的区别。class Solution {public: setv; int getLen(int x) { int len = 1; int start,原创 2013-08-06 15:02:31 · 402 阅读 · 0 评论 -
Best Time to Buy and Sell Stock II
贪心算法,有利可图即买入,卖出。class Solution {public: int maxProfit(vector &prices) { // Start typing your C/C++ solution below // DO NOT write int main() function int len = prices.si原创 2013-08-06 20:19:57 · 574 阅读 · 0 评论 -
Best Time to Buy and Sell Stock III
以每一个i, 计算出从 0 ~ i, i +1 ~ size 两段的最大收益。 再找出两者和最大的就可以了。class Solution {public: int maxProfit(vector &prices) { // Start typing your C/C++ solution below // DO NOT write int main(原创 2013-08-07 12:09:44 · 562 阅读 · 0 评论 -
Permutation Sequence
解法一:最容易想到的就是求出所有的排列组合结果,然后找到第K个返回。class Solution {public: bool flag[15]; char s[15]; string ans; int count = 0; void cal(int n, int index, int k) { if(count == k) re原创 2013-08-07 17:27:27 · 356 阅读 · 0 评论 -
Minimum Window Substring
两个指针: i,j 开始均指向S开头,不断向后移动 j 直至从 i 到 j 能够包含T,之后要尝试移动 i ,同样要保证 i - j包含T。class Solution {public: string minWindow(string S, string T) { // Start typing your C/C++ solution below原创 2013-08-20 09:57:13 · 392 阅读 · 0 评论 -
Merge k Sorted Lists
用到优先队列。/** * Definition for singly-linked list. * struct ListNode { * int val; * ListNode *next; * ListNode(int x) : val(x), next(NULL) {} * }; */class Solution {public: str原创 2013-08-20 16:49:39 · 507 阅读 · 0 评论 -
Rotate Image
按层操作。class Solution {public: void rotate(vector > &matrix) { // Start typing your C/C++ solution below // DO NOT write int main() function int n = matrix.size();原创 2013-08-20 16:12:19 · 352 阅读 · 0 评论 -
Search for a Range
利用二分找到第一个和最后一个匹配。class Solution {public: int findFirst(int a[], int n, int start, int end, int key) { while(start <= end) { int mid = (start + end) >> 1;原创 2013-08-12 11:21:42 · 345 阅读 · 0 评论 -
Search in Rotated Sorted Array
可以采用二分查找。分为3种情况:一, 5, 6, 1, 2, 3 即a[mid] 二,5, 6, 7, 1, 2 即a[mid] >= a[start] && a[mid] > a[end]三,1, 2, 3, 4, 5 即a[mid] >= a[start] && a[mid] 这三种情况是针对数组旋转之后的结果分的。当然,对于每一类,我们还需要考虑是排除前一半还是后一半。原创 2013-08-13 16:21:00 · 383 阅读 · 0 评论 -
Longest Valid Parentheses
DP题,过程如下:计算出以每一个元素结尾所能形成的最长合法括号子串,其中最大值即为所求。记当前位置下标为 i :1,若 i 位置为 ' ( ' ,则dp[i] = 0;2,若 i 位置为 ' ) ' :判断位置 i-dp[i-1]-1 是否为 ' ( ':若不是 dp[i] = 0;若是:dp[i] = dp[i-1] + 2 + dp[i-dp[i-1]-2];当然需要控原创 2013-07-23 14:18:07 · 367 阅读 · 0 评论 -
Sort Colors
题意是: 对只含0,1,2三个元素的数组进行排序。由于只含3个元素,O(nlogn)肯定不是一个好的算法。1,首先能想到的是计数排序,时间复杂度O(n), 空间复杂度O(1):public class Solution { public void sortColors(int[] A) { // Start typing your Java solution bel原创 2013-07-23 12:12:23 · 410 阅读 · 0 评论 -
Best Time to Buy and Sell Stock
对于第i个节点, 计算出从 0 - i的最小值, 从i + 1 - n 的最大值。public class Solution { public int maxProfit(int[] prices) { // Start typing your Java solution below // DO NOT write main() functi原创 2013-07-29 22:14:14 · 396 阅读 · 0 评论 -
Unique Binary Search Trees
http://leetcode.com/onlinejudge#question_96以每个数作为根节点,所形成的BST之和即为所求。 当以x为根节点,x 的左子树会有x-1个节点, 右子树有n-x个节点。 所以这是一个递归的过程, 以f(i)表示i个节点可以形成的BST个数。 则以x为根节点会有 f(x-1)*f(n-x) 个BST。 x取1-n,最终求和即可。 当然,这里会有对称,所以原创 2013-05-17 17:13:24 · 309 阅读 · 0 评论 -
Search a 2D Matrix
从右上角开始查找:相等: 返回true;大于给定值: 则只有可能在这行的前面部分查找成功(这一步的查找也可以用二分);小于给定值:在下一行查找。public class Solution { public boolean searchMatrix(int[][] matrix, int target) { // Start typing your Java原创 2013-05-17 13:11:28 · 495 阅读 · 0 评论 -
Jump Game
0可以看做是坑, 如果每一个坑都能跳过去,那就可以到达最终点。public class Solution { public boolean canJump(int[] A) { // Start typing your Java solution below // DO NOT write main() function if(null==A)原创 2013-05-17 14:31:46 · 343 阅读 · 0 评论 -
Largest Rectangle in Histogram
解题思路:以每个柱子作为高, 向左右搜出最大的宽度,会求出n个值, 从而这n个值中的最大值就是结果。直接贴代码后超时, 受帖子http://www.cnblogs.com/fstang/archive/2013/05/19/3087746.html启发,剪枝后AC。public class Solution { public int bound; publ原创 2013-05-20 15:56:34 · 381 阅读 · 0 评论 -
Maximal Rectangle
还是要感谢这篇文章对我这类题型的帮助:http://www.cnblogs.com/fstang/archive/2013/05/19/3087746.html这题没有用到剪枝也过了。 为了加快速度,可以剪枝。public class Solution { int[][] map; public int maxOfCol(int col, int rows)原创 2013-05-20 16:31:59 · 458 阅读 · 0 评论 -
Edit Distance
简单DP。f (i, j) = f (i-1, j-1) , if (a[i] == b[j]);f (i, j) = min { f (i-1, j-1), f (i-1, j), f (i, j-1)} + 1, else.public class Solutio原创 2013-05-22 14:31:31 · 380 阅读 · 0 评论 -
Palindrome Partitioning II
可以用DP解题,但复杂度为O(n^3),会超时。这题可以转换为单源最短路径:两点之间的距离定义为最少分割几次。 初始化情况是:只有两点之间的部分为回文串才有直接路径,且长度为0.注意调整初始化的顺序,以使得初始化时间复杂度在O(n^2)。public class Solution { public boolean[][] isSymentric; pu原创 2013-05-23 19:34:06 · 330 阅读 · 0 评论 -
Symmetric Tree
解题思路:先得到当前树的镜像树, 之后在判断当前树和镜像树是不是一样的。/** * Definition for binary tree * struct TreeNode { * int val; * TreeNode *left; * TreeNode *right; * TreeNode(int x) : val(x), left(NU原创 2013-05-28 10:07:22 · 289 阅读 · 0 评论 -
Jump Game II
看完题第一感觉,单源最短路,于是敲完代码,提交,超时。之后仔细想了想, 广搜可以解题。广搜:public class Solution { public int jump(int[] A) { // Start typing your Java solution below // DO NOT write main() function原创 2013-05-31 14:32:59 · 386 阅读 · 0 评论 -
Recover Binary Search Tree
首先,对BST中序遍历,得到的就是有序数列。 所以,交换BST中的两个节点,会相应导致中序遍历序列的两个节点位置的交换。以例子说明: 对于序列1,2,3,4,5,6,7 交换两个数字有两种情况1, 交换相邻的两个, 比如2,3. 会得到 1,3,2,4,5,6,7 , 会出现一个数的小于其前驱的情况, 那只需要把这个数和它的前驱交换即可;2,交换非相邻的两个,比如2,6.原创 2013-05-28 16:08:36 · 478 阅读 · 0 评论 -
Longest Palindromic Substring
以每一个,每两个字符为中心,求出最大对称子串。返回所有子串中最长的子串, 时间复杂度O(N^2)。欢迎交流更佳算法。 string longestPalindrome(string s) { // Start typing your C/C++ solution below // DO NOT write int main() function原创 2013-07-15 19:56:16 · 371 阅读 · 0 评论 -
Subsets
先对S进行排序, 之后深搜, 每个数字有选或不选两种情况。class Solution {public: vector > ans; void cal(vector s, vectortmp, int index, int n) { if(index == n) { //if(tmp.size() > 0) ans.push_back(tmp); ret原创 2013-07-17 12:40:56 · 331 阅读 · 0 评论 -
Merge Sorted Array
从后往前进行merge, 时间复杂度在O(m + n)class Solution {public: void merge(int A[], int m, int B[], int n) { // Start typing your C/C++ solution below // DO NOT write int main() function原创 2013-07-18 16:36:37 · 370 阅读 · 0 评论 -
Search in Rotated Sorted Array II
和http://blog.csdn.net/mazhichao300/article/details/9950089类似,只是第三种情况的时候,我们无法再去排除一半,只能两边都去搜索。比如:3, 6, 3, 3, 3(target = 6)就无法确定。这样时间复杂度是多少呢?class Solution {public: bool bs(int a[], int star原创 2013-08-13 16:44:04 · 456 阅读 · 1 评论