- 博客(120)
- 收藏
- 关注
原创 329. Longest Increasing Path in a Matrix LeetCode
题意:求矩形内最长上升序列,可以从任意格子出发,只能走上下左右四个格子。 题解:记忆化搜索。class Solution { public: int dir[4][2] = {{0,1},{0,-1},{1,0},{-1,0}}; int dfs(int i ,int j,vector<vector<int>>& dp,vector<vector<int>>& matrix)
2016-02-16 19:35:49 266
原创 109. Convert Sorted List to Binary Search Tree LeetCode
题意:把排序好的链表转换成二叉搜索树。 题解:和把排序好的数组转换成二叉搜索树是一个思路,每次从中间分开。这里用slow和fast去找链表的中间节点。class Solution { public: TreeNode* sortedListToBST(ListNode* head) { if(head == NULL) return NULL; if(hea
2016-02-16 19:22:51 208
原创 39. Combination Sum LeetCode
题意:给出n个元素和k,求所有由n个元素加和等于k的集合。n个元素可以重复使用多次。 题解:递归class Solution { public: void dfs(vector<int>& candidates, int target, vector<int>& pre, vector<vector<int>>& ans,int k,int sum) { if(su
2016-02-16 19:20:39 198
原创 114. Flatten Binary Tree to Linked List LeetCode
题意:把二叉树变成链表。 题解:一边往下遍历一边改变树的形态。class Solution { public: void dfs(TreeNode* root,TreeNode* &pre) { if(root == NULL) return; if(pre != NULL) pre->left = NULL,pre->rig
2016-02-16 19:18:08 185
原创 78. Subsets LeetCode
题意:给出一个集合,求这个集合的所有子集。要求集合内升序排序。 题解:递归求解。class Solution { public: void dfs(vector<vector<int>>& ans,vector<int> pre,vector<int>& nums ,int k) { for(int i = k; i < nums.size(); i++)
2016-02-16 19:12:15 293
原创 279. Perfect Squares LeetCode
题意:求n能最少能由多少个完全平方数组成。 提交:dp,dp[i]表示i这个数字最少能由多少个完全平方数组成。转移: dp[i] = i(由i个1组成), dp[i] = min(dp[i],dp[i - j * j])( 0<= j <= sqrt(i));class Solution { public: int numSquares(int n) { int dp[n
2016-02-16 19:10:05 253
原创 142. Linked List Cycle II LeetCode
题意:求链表中环的第一个节点。 题解:用slow和fast。假设起点是a,第一个进入环的节点是b,slow和fast相遇的节点是c。那么有2(ab + bc) = ab + bc + cb + bc。 ab = cb。所以我们让slow和fast先相遇,这时得到slow和fast都是c点,然后slow再从链表头开始走,直到slow与fast相等,这时候的slow和fast都是b点。class S
2016-02-16 19:07:17 200
原创 81. Search in Rotated Sorted Array II LeetCode
题意:在旋转数组中查找一个数,与之前不同的是旋转数组里面会有重复的数字出现。 题解:一样的套路,旋转之后的数组,要么是一段连续递增的,要么是两段,分情况讨论二分。class Solution { public: bool search(vector<int>& nums, int target) { int l = 0,r = nums.size() - 1;
2016-02-16 18:58:06 203
原创 215. Kth Largest Element in an Array LeetCode
题意:给了一个乱序的数组,求排序好之后的第k大数。 题解:排序即可。class Solution { public: static bool cmp(int a,int b){return a > b;} int findKthLargest(vector<int>& nums, int k) { sort(nums.begin(),nums.end(),cmp);
2016-02-16 18:32:31 187
原创 313. Super Ugly Number LeetCode
题意:给你k个素数,让你求第n个丑数,臭数的定义是,只包含给定的素质因子的数。1是特殊的丑数。 题解:每个质素都有一个队列,相当于多个队列取一个最小的出队一样。class Solution { public: int nthSuperUglyNumber(int n, vector<int>& primes) { int k = primes.size();
2016-02-16 18:29:24 388
原创 80. Remove Duplicates from Sorted Array II LeetCode
题意:给出一个排好序的数组,让你使得数组每个元素最多出现2次,把多余的去掉。 题解:直接模拟。class Solution { public: int removeDuplicates(vector<int>& nums) { int ans = 0,count = 1; int n = nums.size(); if(n == 0) ret
2016-02-16 17:40:55 200
原创 129. Sum Root to Leaf Numbers LeetCode
题意:求二叉树所有根到叶子组成的数字之和。 题解:DFS。class Solution { public: int ans; void dfs(int num,TreeNode* root) { if(root->left == NULL && root->right == NULL) ans += num * 10 + root->
2016-02-16 17:35:59 198
原创 275. H-Index II LeetCode
题意:给你排好序的数组,让你求H-Index值。 题解:class Solution { public: int hIndex(vector<int>& citations) { int ans = 0; int n = citations.size(); for(int i = n - 1; i >= 0; i--) {
2016-02-16 17:28:17 229
原创 241. Different Ways to Add Parentheses LeetCode
题意:给出一个算术表达式,在合法的地方加括号改变运算顺序,求所有的合法添加括号方案得到的值。 题解:递归,遇到运算符的时候,递归的求左边能返回的值和右边能返回的值,然后做运算得到新的值。class Solution { public: vector<int> diffWaysToCompute(string input) { vector<int> ans;
2016-02-16 17:23:02 230
原创 162. Find Peak Element LeetCode
题意:寻找波峰。即num[i - 1] < num[i] > num[i + 1].返回任意一个即可。 题解:直接找。class Solution { public: int findPeakElement(vector<int>& nums) { int n = nums.size(); if(n == 1) return 0; if(n
2016-02-15 19:12:42 248
原创 199. Binary Tree Right Side View LeetCode
题意:求出二叉树每一层最右边的节点值。 题解:BFS./** * Definition for a binary tree node. * struct TreeNode { * int val; * TreeNode *left; * TreeNode *right; * TreeNode(int x) : val(x), left(NULL), ri
2016-02-15 19:08:48 248
原创 73. Set Matrix Zeroes LeetCode
题意:给出一个01矩阵,如果i行j列的格子是0,那么把i行和j列的所有格子全变成0.要求不使用额外空间。 题解:我们可以先找到第一个是0的格子,那么我们再把其他为0的格子信息存到i行j列里面,代码会有点长。class Solution { public: void setZeroes(vector<vector<int>>& matrix) { int row = -1,c
2016-02-15 18:56:46 205
原创 74. Search a 2D Matrix LeetCode
题意:在一个矩阵中搜索是否存在数target,矩阵中的数字每一行递增,每一行的第一个数字都比上一行的最后一个数字大。 题解:先二分搜在那一行,然后在那一行里面二分搜索是否存在target。class Solution { public: bool searchMatrix(vector<vector<int>>& matrix, int target) { int l =
2016-02-15 18:48:22 232
原创 173. Binary Search Tree Iterator LeetCode
题意:实现二叉树的迭代器。也就是实现hasnext,next。 题解:用stack去实现。/** * Definition for binary tree * struct TreeNode { * int val; * TreeNode *left; * TreeNode *right; * TreeNode(int x) : val(x), left
2016-02-15 18:34:15 226
原创 77. Combinations LeetCode
题意:给出n和k,求所有的有1…n中选出k个数组成的集合。 题解:递归。class Solution { public: void dfs(int n,int k,int x,vector<int> v,vector<vector<int>>& ans) { if(k == 0) { ans.push_back(v);
2016-02-15 18:17:58 211
原创 89. Gray Code LeetCode
题意:求n位格雷码表示的十进制数。 题解:递归,这里用bitset方便储存。class Solution { void utils(bitset<32>& bits, vector<int>& result, int k){ if(k==0){ result.push_back(bits.to_ulong()); }
2016-02-14 19:29:21 236
原创 75. Sort Colors LeetCode
题意:给出一个只包含0,1,2三种数字的数组,让你把数组排好序。 题解:把0换到前面,把2换到后面。class Solution { public: void sortColors(vector<int>& nums) { int l = 0, r = nums.size() - 1; int zerox = 0; while(l <= r)
2016-02-14 19:22:20 221
原创 300. Longest Increasing Subsequence LeetCode
题意:最长公共子序列。 题解:dp。class Solution { public: int lengthOfLIS(vector<int>& nums) { int n = nums.size(); int dp[n]; int j = 0,k; for(int i = 0; i < n; i++) dp[i] = -0x3
2016-02-14 19:19:13 175
原创 289. Game of Life LeetCode
题意:生命游戏,给出你这一秒的生物存活情况,和游戏规则。让你给出下一秒生物存活的情况。规则1:如果一个活细胞周围只有1个或者1个以下的活细胞,那么这个细胞下一秒将会死。规则2:如果一个活细胞周围有2个或者3个活细胞,那么这个细胞下一秒将会活着。规则3:如果一个活细胞周围有4个或者4个以上活细胞,那么这个细胞下一秒将会死。规则4:如果一个死细胞周围有3个活细胞,那么这个死细胞下一秒将会活过来。 题解
2016-02-14 19:18:19 274
原创 11. Container With Most Water LeetCode
题意:有n个位置,给出每个位置的高度,选择两个位置和x轴形成贮水池,问贮水池最大面积是多少。 题解:用两个指针往中间移动,每移动一次就算一次面积,直到两个指针相遇,指针如何移动?哪边的高度小,哪边的指针就往中间移动一次。class Solution { public: int maxArea(vector<int>& height) { int l = 0,r = heig
2016-02-14 19:12:16 176
原创 48. Rotate Image LeetCode
题意:将矩阵顺时针选择90度。 题解:先把矩阵按左上角到右下角这条线对称交换(i,j)和(j,i)互换,再把交换后的矩阵按照中线旋转交换,也就是(i,j)和(i,n - j -1)交换。就能得到,不理解的话可以拿一张纸旋转一下就明白了。class Solution { public: void rotate(vector<vector<int>>& matrix) { in
2016-02-14 19:05:09 232
原创 59. Spiral Matrix II LeetCode
题意:把1到n一圈一圈的顺序写到矩形里。 题解:模拟。class Solution { public: vector<vector<int>> generateMatrix(int n) { vector<vector<int>> ma(n, vector<int>(n)); int t = 0,num = 1; while(t < (n +
2016-02-14 18:57:24 216
原创 216. Combination Sum III LeetCode
题意:给出n和k,表示你可以使用1-9中的n个数加和组成k,每种组合中1-9的每个数组只能使用一次。要求组合中数字按升序排序。 题解:递归搜索。class Solution { public: void dfs(int n,int k,int x,vector<int> v,vector<vector<int>>& ans) { if(n < 0 || k < 0)
2016-02-14 18:52:51 293
原创 64. Minimum Path Sum LeetCode
题意:给出一个NxM的矩阵,每个格子有一个非负数,从左上角走到右下角,每次只能往下或者往右走一格,求一条路径,使得走过的格子数字之和最小。 题解:dp。dp[i][j] 表示从0,0走到i行j列这个格子的最小数字和。 dp[i][j] = min(dp[i - 1][j],dp[i][j - 1]) + num[i][j].class Solution { public: int min
2016-02-14 18:48:06 234
原创 24. Swap Nodes in Pairs LeetCode
题意:给出一个链表,链表的节点成对交换,也就是1和2换,3和4换。。。n - 1和n换。 题解:模拟即可,增加一个虚拟头结点。class Solution { public: ListNode* swapPairs(ListNode* head) { ListNode *t = new ListNode(0); ListNode *temp;
2016-02-14 18:45:16 204
原创 46. Permutations LeetCode
题意:求1到n的全排列。 题解:STL之next_permutation.当然,可以自己递归实现。class Solution { public: vector<vector<int>> permute(vector<int>& nums) { vector<vector<int>> ans; sort(nums.begin(),nums.end());
2016-02-14 18:43:03 207
原创 121. Best Time to Buy and Sell Stock LeetCode
题意:给出每天股票的价格,只能进行一次交易,求最大收益。 题解:DP,minprice表示1…到i天价格最低的股票,maxprice表示1…i天最大收益。maxprice = max(maxprice,price[i] - minprice).class Solution { public: int maxProfit(vector<int>& prices) { int
2016-02-14 18:41:22 211
原创 62. Unique Paths LeetCode
题意:给出一个NxM的矩阵,一个人从左上角出发走到右下角,每次只能往右或者往下移动一格,问有多少种不同的走法。 题解:dp , dp[i][j]代表从0,0走到行为i列为j的格子的方案数。转移: dp[i][j] = dp[i - 1][j] + dp[i ][j - 1].class Solution { public: int uniquePaths(int m, int n) {
2016-02-14 18:37:18 205
原创 309. Best Time to Buy and Sell Stock with Cooldown LeetCode
题意:给出每天股票的价格,每次卖出股票之后得隔一天才能再买入,求最大收益。 题解:dp,buy[i]表示第i天买入股票得到的最大收益,sell[i]表示第i天卖出股票得到的最大收益。答案是sell[n]。转移:buy[i] = max(buy[i - 1],sell[i - 2] - prices[i]). sell[i] = max(sell[i - 1],buy[i - 1] + prices
2016-02-14 18:34:05 235
原创 153. Find Minimum in Rotated Sorted Array LeetCode
题意:给出一个排好序的数组,然后旋转未知数次,求数组中的最小元素。 题解:你会发现,不管旋转几次,最后要么是一段完整的递增数列,要么是两段递增数列。那么我们还是可以使用二分来求。class Solution { public: int findMin(vector<int>& nums) { int l = 0,r = nums.size() - 1; wh
2016-02-14 18:27:44 183
原创 22. Generate Parentheses LeetCode
题意:给出括号的数目,求所有合法的括号表示。 题解:递归,先递归左括号,再递归右括号。class Solution { public: void dfs(int l,int r,string res,vector<string>& ans) { if(l < 0 || r < 0 || l > r) return ; if(l == 0 && r =
2016-02-14 18:24:43 182
原创 230. Kth Smallest Element in a BST LeetCode
题意:在平衡二叉树中求第k大的元素。 题解:访问一个节点时,看左子树有几个节点,如果小于k - 1,往右子树递归搜索,等于k - 1,返回该节点,大于k - 1,往左子树递归搜索。class Solution { public: int calleft(TreeNode *root) { if(root == NULL) return 0; retu
2016-02-14 18:22:23 138
原创 53. Maximum Subarray LeetCode
题意:给一个数组,求最大连续子段和。 题解:DP,dp代表局部最大子段和,maxsum代表全局最大子段和。class Solution { public: int maxSubArray(vector<int>& nums) { int dp = 0,maxsum = -0x3f3f3f3f; int n = nums.size(); for
2016-02-14 18:18:26 154
原创 108. Convert Sorted Array to Binary Search Tree LeetCode
题意:把一个排好序的数组转换成一棵平衡二叉树。 题解:dfs建树,每次取中间作为分界点。class Solution { public: TreeNode* dfs(vector<int>& nums,int l,int r) { if(l > r) return NULL; int mid = (l + r) >> 1; TreeN
2016-02-14 18:16:16 153
原创 116. Populating Next Right Pointers in Each Node LeetCode
题意:给一棵二叉树,给每个节点增加一个right指针,指向同层的它的右边第一个节点。 题解:BFSclass Solution { public: void connect(TreeLinkNode *root) { if(!root) return ; queue<TreeLinkNode*> q; q.push(root);
2016-02-14 18:11:01 181
空空如也
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人