leetcode
文章平均质量分 53
qwurey
学生
展开
-
树 Maximum Depth of Binary Tree
这里的深度是指一支上最多的节点个数。/** * Definition for binary tree * struct TreeNode { * int val; * TreeNode *left; * TreeNode *right; * TreeNode(int x) : val(x), left(NULL), right(NULL) {} *原创 2015-04-11 21:26:23 · 278 阅读 · 0 评论 -
树 Symmetric Tree
方法一:递归/** * Definition for binary tree * struct TreeNode { * int val; * TreeNode *left; * TreeNode *right; * TreeNode(int x) : val(x), left(NULL), right(NULL) {} * }; */clas原创 2015-04-11 21:12:45 · 318 阅读 · 0 评论 -
树 Balanced Binary Tree
思想:每一节点的左支和右支的深度和不能超过1;每一节点(作为它父节点的左支或右支)都有一个深度值要返回,以便在其父节点进行平衡判断;/** * Definition for binary tree * struct TreeNode { * int val; * TreeNode *left; * TreeNode *right; *原创 2015-04-11 21:46:51 · 394 阅读 · 0 评论 -
树 Same Tree
方法一:递归树相等 即 两个树的当前节点值 && 当前节点的左子树 && 当前节点的右子树 都相等。/** * Definition for binary tree * struct TreeNode { * int val; * TreeNode *left; * TreeNode *right; * TreeNode(int x) : v原创 2015-04-11 20:47:20 · 297 阅读 · 0 评论 -
数组 Remove Duplicates from Sorted Array
class Solution {public: int removeDuplicates(int A[], int n) { if(n == 0) return 0; int index = 0; for(int i = 1; i < n ; i++) { if(A[index] != A[i]) {原创 2015-04-06 22:28:15 · 444 阅读 · 0 评论 -
数组 Remove Duplicates from Sorted Array II
class Solution {public: int removeDuplicates(int A[], int n) { if(n <= 2) return n; int index = 2; for(int i = 2; i < n; i++) { if(A[i] != A[index-2]) {原创 2015-04-06 22:32:05 · 393 阅读 · 0 评论 -
树 Minimum Depth of Binary Tree
思想:root为空,返回0;只有root节点,返回1;root左子树为空,返回右子树深度+1;root右子树为空,返回左子树深度+1;否则,返回左子树和右子树的最小者再+1;/** * Definition for binary tree * struct TreeNode { * int val; * TreeNode *left; *原创 2015-04-12 11:27:24 · 398 阅读 · 0 评论 -
链表 Add Two Numbers
思想:注意细节。/** * Definition for singly-linked list. * struct ListNode { * int val; * ListNode *next; * ListNode(int x) : val(x), next(NULL) {} * }; */class Solution {public:原创 2015-04-12 17:02:57 · 503 阅读 · 0 评论 -
树 Path Sum
方法一:迭代,BFS。为每个节点保存一个从root到当前节点的sum和,若到了叶子节点,比对该sum和与给定的sum是否相等。/** * Definition for binary tree * struct TreeNode { * int val; * TreeNode *left; * TreeNode *right; * TreeNode(i原创 2015-04-12 14:46:06 · 485 阅读 · 0 评论 -
字符串 Substring with Concatenation of All Words
思想:给定s,找符合条件的串s',该s'包括给定words中的每一个word且仅包含1次,不包含其他字符,返回若干个s'的起始位置。学习unordered_map:unordered_map是一种无序的、键值对应的哈希容器。允许通过key快速索引value,不允许多个value对应到同一个key。构造函数:unordered_map(unordered_map t)原创 2015-04-23 16:18:33 · 493 阅读 · 0 评论 -
DFS Permutations II
思想:此题允许序列中又重复的元素。一个判定规则:(先排序)如果num[i-1] == num[i] 且 前面的那个数还没有用过的话,则说明这样下去必定会产生重复的排列。因为进入下一深度,必然会用num[i-1],就形成了num[i],num[i-1]这样的情形,跟先前已经有的num[i-1],num[i]是重复的序列。class Solution {pub原创 2015-04-23 21:53:55 · 541 阅读 · 0 评论 -
取反 Single Number
思想:1^1 == 0 is true.class Solution {public: int singleNumber(vector& nums) { int i,result=nums[0]; for(int i=1;i<nums.size();i++) { result = result^nums[i];原创 2015-04-23 22:08:48 · 448 阅读 · 0 评论 -
数组 Median of Two Sorted Arrays
思想:两个有序数组,找第K大的元素,要求时间复杂度在O(log(M+N))级。O(M+N)易想到,加个log就要想到会用到递归。不失一般性,假设M若k/2 (a)若 A[k/2 -1] (b)若 A[k/2 -1] > B[k/2 -1],则B[0]~B[k/2 -1]这些元素可以删除;(c)若 A[k/2 -1] = B[k/2 -1],则返回A[k/2 -1] or原创 2015-04-08 10:47:50 · 410 阅读 · 0 评论 -
数组 Remove Element
时间复杂度:O(n)class Solution {public: int removeElement(int A[], int n, int elem) { int index = 0; for(int i = 0; i < n; i++) { if(A[i] != elem) { A[inde原创 2015-04-08 15:34:17 · 435 阅读 · 0 评论 -
DFS Permutations
思想:DFSclass Solution {public: //Permutations void dfs(vector> &res, vector num, vector &path) { if(path.size() == num.size()) { res.push_back(path); re原创 2015-04-23 20:32:23 · 584 阅读 · 0 评论 -
数学技巧 ZigZag Conversion
思想:关键是归纳出元素出现位置的公式。比如 nRows =4 的情形需要下面这样的分布:第0行:0 + + 6 + + 12第1行:1 + 5 7 + 11 第2行:2 4 + 8 10第3行:3 + + 9 (1)对于 第0行 && 第3行(最后一行):出现的元素在原串的位置依次是:0,6,12规律是:0,0+2*nRows-2=6,6+2*nRows-原创 2015-04-14 21:17:02 · 919 阅读 · 0 评论 -
字符串 Longest Substring Without Repeating Characters
思想:题意是 在原串中找到最长的一组每个字符最多出现一次的子串。方法是使用双指针在原串中进行扫描,时间复杂度O(n)。i表示满足条件的串的起始位置;j表示满足条件的串的结束位置;在一次遍历过程中记录长度最长的串的长度到maxLen中;j每次往前移动一单位,遇到一个新的字符,判断当前集合中是否已经存在该字符(1)若存在,移动i指针,直到排除之前出现过的这个元素;(2)原创 2015-04-13 22:23:11 · 333 阅读 · 0 评论 -
细节 String To Integer
细节: int num = 0; int sign = 1; const unsigned long size = str.size(); int i = 0; while(str[i] == ' ' && i < size) ++i; if(str[i] == '-') { sign = -1; i++;原创 2015-04-08 22:28:50 · 552 阅读 · 0 评论 -
数组 3Sum Closest
思想:求三数之和最接近target的那组数。先排序,再左右夹逼。时间复杂度O(n^2)。class Solution {public: int threeSumClosest(vector &num, int target) { int result = 0; int min_gap = INT_MAX; sort(nu原创 2015-04-08 14:25:41 · 434 阅读 · 0 评论 -
数组 4Sum
思想:方法一:先排序再左右夹逼,时间复杂度O(n^3),但会TLE。//4Sum O(n^3)vector> fourSum(vector &num, int target) { vector> result; if(num.size()<4) return result; sort(num.begin(),num.end()); auto last原创 2015-04-08 14:39:01 · 509 阅读 · 0 评论 -
细节 Reverse Integer
细节:提前判断result如果下一次溢出,直接返回0;不能使用下面的语句:if(result * 10 + (x % 10) > INT_MAX)class Solution {public: int reverse(int x) { bool isNegtive = x >= 0 ? false : true; x =原创 2015-04-08 22:00:20 · 392 阅读 · 0 评论 -
数组 Longest Consecutive Sequence
思想:序列无序且要求O(n),哈希最有可能。线性的找一个可以向两边扩张最大的元素,返回扩张的长度。class Solution {public: int longestConsecutive(vector &num) { unordered_map used; for(auto i: num)原创 2015-04-08 11:01:37 · 449 阅读 · 0 评论 -
数组 3Sum
思想:左右夹逼(先排序才能做)时间复杂度O(max(n*logn , n^2))最终要找到这样一组(i,j,k):target = num[i] + num[j] + num[k]从0到last-1 循环i,然后j = i+1 ,k = last -1,开始左右夹逼,以此类推。class Solution {public: vector > three原创 2015-04-08 13:44:28 · 457 阅读 · 0 评论 -
数组 Next Permutation
找给定序列的下一个字典序中的序列。思想:1、从右往左找第一个不满足升序的数,记该数下标为i;2、从右往左找第一个比该数大的数,记下标味j;3、交换两数:swap(num[i],num[j]);4、将下标i+1到最后的数字反转;class Solution {public: void nextPermutation(vector &num) {原创 2015-04-08 20:37:25 · 478 阅读 · 0 评论 -
最长回文子串 Longest Palindromic Substring
思路:方法一:暴力,时间复杂度O(n^3),空间复杂度O(1)不断判断子串是否回文。//Longest Palindromic Substringstring longestPalindrome(string s) { int length=s.size(); int maxLength=1; int start=0; for(int i=0;i<le原创 2015-04-19 11:17:38 · 483 阅读 · 0 评论 -
数组 Container With Most Water
思想:start初始指向0,end指向size-1;若height[start]短,start++;若height[end]短,end--;即每次刷新最短的隔板。class Solution {public: int maxArea(vector& height) { int start = 0; int end = heigh原创 2015-04-20 14:07:28 · 356 阅读 · 0 评论 -
数组 Integer to Roman
思想:罗马数字基本规则:#1 基本字符罗马数字IVXLCDM阿拉伯数字1510501005001000#2 相同的数字连写,所表示的数等于这些数字相加得到的数,如:Ⅲ = 3;#3 小的数字在大的数字的右边,所表示的数等于这些数字相加得到的数, 如:Ⅷ = 8;Ⅻ = 12;原创 2015-04-20 14:48:03 · 298 阅读 · 0 评论 -
DFS Letter Combinations of a Phone Number
思想:DFSclass Solution {public: const vector dict={"","","abc","def","ghi","jkl","mno","pqrs","tuv","wxyz"}; void dfs(string digits, int depth, string path, vector &res) {原创 2015-04-20 15:40:33 · 553 阅读 · 0 评论 -
K链表合并 Merge k Sorted Lists
思想:分布式常见题型。刚开始的思路:逐一合并,合并的时间复杂度用O(N) ——> TLE ListNode *mergeKLists(vector &lists) { if( lists.size() == 0) return nullptr; ListNode *p = lists[0]; for(int i=1; i <原创 2015-04-20 20:05:50 · 3980 阅读 · 0 评论 -
栈 Valid Parentheses
思想:栈的操作。class Solution {public: bool isValid(string s) { string left = "([{"; string right = ")]}"; stack stk; for(auto c : s) { if(left.find(c原创 2015-04-09 14:18:12 · 395 阅读 · 0 评论 -
链表 Swap Nodes in Pairs
思想:创建一个辅助头结点简便编程。下一轮swap中若first为NULL,则second直接设为NULL。/** * Definition for singly-linked list. * struct ListNode { * int val; * ListNode *next; * ListNode(int x) : val(x), ne原创 2015-04-09 16:54:47 · 531 阅读 · 0 评论 -
二分法 Pow(x, n)
思想:二分法。如果n是奇数,x^n = x^(n/2) * x^(n/2) * x ;如果n是偶数,x^n = x^(n/2) * x^(n/2) ;class Solution {public: //Pow(x, n) double func(double x, int n) { if(n == 0) return 1;原创 2015-04-24 17:34:17 · 697 阅读 · 0 评论 -
DFS Generate Parentheses
思想:DFSclass Solution {public: //Generate Parentheses void generate(vector &res, string s, int n, int l, int r) { if(l==n) { s.append(n-r, ')');//add n ')'原创 2015-04-20 17:08:33 · 424 阅读 · 0 评论 -
细节 Roman to Integer
细节:Roman数字转化成阿拉伯数字规则:1、相同的数字连写,所表示的数等于这些数字相加得到的数,如:Ⅲ = 3;2、小的数字在大的数字的右边,所表示的数等于这些数字相加得到的数, 如:Ⅷ = 8;Ⅻ = 12;3、小的数字,(限于Ⅰ、X 和C)在大的数字的左边,所表示的数等于大数减小数得到的数,如:Ⅳ= 4;Ⅸ= 9;class Solutio原创 2015-04-09 10:02:42 · 481 阅读 · 0 评论 -
链表 Remove Nth Node From End of List
思想:这题的技巧是删除倒数第n个元素,要求只遍历一遍。先设两个指针p、q同时指向开头处;让p先走n步;然后再让p、q同时走,直到p走到头;此时,q的下一个就是所要删除的元素。此题为了方便操作,加入了一个头结点。/** * Definition for singly-linked list. * struct ListNode { * int原创 2015-04-09 14:01:32 · 534 阅读 · 0 评论 -
数组 Plus One
思想:高精度加法。class Solution {public: vector plusOne(vector &digits) { //reverse reverse(digits.begin(), digits.end()); int carry = 1; for(int i=0;i<digits.size原创 2015-04-09 21:20:14 · 367 阅读 · 0 评论 -
链表 Remove Duplicates from Sorted List
思想:时间复杂度O(n)。/** * Definition for singly-linked list. * struct ListNode { * int val; * ListNode *next; * ListNode(int x) : val(x), next(NULL) {} * }; */class Solution {pub原创 2015-04-09 21:38:41 · 398 阅读 · 0 评论 -
细节&数组 Spiral Matrix II
思想:跟上题思路一样。注意用vector创建二维数组时候指定维数的方法:vectorvectorint>> res(n,vectorint>(n));class Solution {public: vector > generateMatrix(int n) { vector> res(n,vector(n));原创 2015-04-26 10:55:02 · 434 阅读 · 0 评论 -
贪心 Jump Game II
思想:上一题用reach表示每一跳最远到达的位置,但是每一跳都按最远的跳不一定是最优路径(最少步数)。但是有一个是很确定的:如果当前位置超出了上一次算出的最远所能到达的位置reach,就必须step++,所以这里用一个range来记录上一次算出的最远所能到达的位置,即到了不得不跳的时候必须跳。时间复杂度O(N),空间复杂度O(1)。class Solution {pu原创 2015-04-25 11:00:55 · 483 阅读 · 0 评论 -
模拟 Jump Game
思想:每次更新所能到达的最远位置,最后看是否大于等于最后一个元素的位置。class Solution {public: bool canJump(vector& nums) { int reach = 0; for(int i=0; i<=reach && reach<nums.size()-1; i++) { reach原创 2015-04-29 12:24:46 · 374 阅读 · 0 评论