![](https://img-blog.csdnimg.cn/20201014180756928.png?x-oss-process=image/resize,m_fixed,h_64,w_64)
LeetCode
文章平均质量分 59
OracleDesire
这个作者很懒,什么都没留下…
展开
-
Evaluate Reverse Polish Notation
依然很简单,就不多说了,注意库函数的使用和STL的使用就好。class Solution {public: int evalRPN(vector &tokens) { stack tmp; for (int i = 0; i < tokens.size(); ++i) { if (tokens[i] != "+"原创 2013-12-09 10:48:53 · 385 阅读 · 0 评论 -
Best Time to Buy and Sell Stock II
这是道非常简单的题目,但是刚开始的时候我实在是想的太多了,基本的思想很简单,就是找到所有的上升子序列,将头尾的差值加起来就可以了。不过我最开始一直在考虑如何快速方便地找到上升子序列,结果将简单的问题复杂化。所以这个问题就是,相邻两个数做差,后面的数大的话,这个差就是有效的。class Solution {public: int maxProfit(vector &prices)原创 2013-12-08 23:13:42 · 480 阅读 · 0 评论 -
Populating Next Right Pointers in Each Node
不难的一道题,但是我始终没想出如何用常数空间来完成……我使用了广搜的办法,思路特别简单,要点是每层放入队列以后在最后面插入一个NULL节点来作标记位。/** * Definition for binary tree with next pointer. * struct TreeLinkNode { * int val; * TreeLinkNode *left, *right原创 2013-12-09 22:38:20 · 312 阅读 · 0 评论 -
Max Points on a Line
代码真的是太丑了,刚开始的时候思路简单,利用向量共线的原理,三点A(x1, y1) B(x2, b2) C(x3, y3),如果(x3 - x1) * (y2 - y1) == (x2 - x1) * (y3 - y1),那么ABC三点共线。于是先在集合里任取两点,再遍历第三点,判断是否共线即可。然而测试用例里陷进很多,相同的点在计算时是需要重复计数的,然而,如果相同的点作为最初选定的点,那么原创 2013-12-09 11:30:46 · 379 阅读 · 0 评论 -
Pow(x, n)
思路太简单了,快速幂嘛,二分下去就可以得到log级的算法。但是!陷进重重,主要在这里,(1.00000, -2147483648),如果一进函数发现n class Solution {public: double pow(double x, int n) { if (n == 0) return 1; double原创 2013-12-09 12:13:36 · 534 阅读 · 0 评论 -
Remove Duplicates from Sorted List II
链表仍然是我的老大难……总是过分关注于边界条件了。/** * Definition for singly-linked list. * struct ListNode { * int val; * ListNode *next; * ListNode(int x) : val(x), next(NULL) {} * }; */class Solution原创 2013-12-09 21:17:10 · 412 阅读 · 0 评论 -
Restore IP Addresses
枚举即可,但是小错误不断。需要注意的是,有前导0的也属于不合法地址,不能被算进来。class Solution {public: vector restoreIpAddresses(string s) { vector res; int n = s.length(); int i, j, k; vector tmp; for原创 2013-12-09 15:54:41 · 454 阅读 · 0 评论 -
Maximum Subarray
这个非常经典,也很重要,还需好好理解。class Solution {public: int maxSubArray(int A[], int n) { int sum = 0; int max = INT_MIN; for (int i = 0; i < n; ++i) { sum += A[i];原创 2013-12-10 23:58:40 · 337 阅读 · 0 评论 -
Path Sum
简单,注意变量的初始化!/** * Definition for binary tree * struct TreeNode { * int val; * TreeNode *left; * TreeNode *right; * TreeNode(int x) : val(x), left(NULL), right(NULL) {} * }; *原创 2013-12-11 00:15:33 · 326 阅读 · 0 评论 -
Single Number II
我感觉这种题十分经典!贴一个别人的思路解析:To solve this problem using only constant space, you have to rethink how the numbers are being represented in computers -- using bits.If you sum the ith bit of all nu原创 2013-12-10 16:24:46 · 340 阅读 · 0 评论 -
Remove Duplicates from Sorted Array
思路很简单,从前往后类似链表的形式做就可以了。class Solution {public: int removeDuplicates(int A[], int n) { int curr = -1; for (int i = 0; i < n - 1; ++i) { if (A[i] != A[i + 1]) {原创 2013-12-10 23:19:59 · 260 阅读 · 0 评论 -
Climbing Stairs
还是我的递归好理解一些……记得要用DP哦!class Solution {public: int data[100] = {0}; int climbStairs(int n) { if (n == 0) return 0; if (n == 1) return 1; if (n == 2) retu原创 2013-12-10 23:35:27 · 311 阅读 · 0 评论 -
Sum Root to Leaf Numbers
居然一次就过了!!狗眼已亮瞎。双端队列,保存到叶子节点以来路径上的所有点即可,计算数的时候其实是用了atoi的一个实现。/** * Definition for binary tree * struct TreeNode { * int val; * TreeNode *left; * TreeNode *right; * TreeNode(in原创 2013-12-10 17:17:03 · 325 阅读 · 0 评论 -
Binary Tree Level Order Traversal II
不多说,广搜,最后把结果反转一下就OK。/** * Definition for binary tree * struct TreeNode { * int val; * TreeNode *left; * TreeNode *right; * TreeNode(int x) : val(x), left(NULL), right(NULL) {}原创 2013-12-11 14:27:40 · 312 阅读 · 0 评论 -
Reverse Integer
我模仿之前在某xv6源代码里看到的极其NB的递归算法,只是看来不得精髓啊。class Solution {public: int reverse(int x) { if (x == 0) return 0; int a = x; int i = 0; while (a) { a /= 10; ++i; } return helpe原创 2013-12-11 14:57:53 · 317 阅读 · 0 评论 -
Unique Paths
好吧我知道用组合数学可以做!但是我就想用计算机让他算来着,思想简单,helper(m, n, i, j)表示从(i, j)这个位置到终点有多少种走法,由于从每个点出发只有两条路,因此用分类计数法,把这两条路上可走路径加起来,就得到了从(i, j)出发所有可能的路径。记得用DP就好。class Solution {public: int map[101][101]; int uni原创 2013-12-11 15:14:25 · 360 阅读 · 0 评论 -
Plus One
要是面试是这种题就好了……完全模拟小学加法。class Solution {public: vector plusOne(vector &digits) { int n = digits.size(); digits[n - 1]++; for (int i = n - 1; i > 0; --i) { if原创 2013-12-11 15:20:03 · 312 阅读 · 0 评论 -
Best Time to Buy and Sell Stock
和之前一个题类似,但是这次要求只能买卖一次。所以嘛,从头开始扫描,扫描的过程中记录本点之前的最低点,然后算本点和最低点的利润,记录这些利润的最大值即可。class Solution {public: int maxProfit(vector &prices) { int n = prices.size(); if (n == 0)原创 2013-12-11 14:11:46 · 430 阅读 · 0 评论 -
Subsets
打错一个变量害死我了……class Solution {public: vector > subsets(vector &S) { sort(S.begin(), S.end()); vector> res; vector path; for (int i = 0; i <= S.size(); ++i)原创 2013-12-11 21:37:00 · 330 阅读 · 0 评论 -
Subsets II
这个题真的是这么做的吗!!——把Subset里的结果中所有重复的删掉就OK了。class Solution {public: vector > subsetsWithDup(vector &S) { sort(S.begin(), S.end()); vector> res; vector path; f原创 2013-12-11 21:44:54 · 297 阅读 · 0 评论 -
Convert Sorted Array to Binary Search Tree
递归法构造一棵平衡二叉树。构造时,取中间的数为根,然后左右两边再取中间的点为根,如此继续下去。/** * Definition for binary tree * struct TreeNode { * int val; * TreeNode *left; * TreeNode *right; * TreeNode(int x) : val(x)原创 2013-12-11 23:18:15 · 321 阅读 · 0 评论 -
String to Integer (atoi)
溢出这里我没有找到很优雅的解决方案,目前只能是在左移之前,先判断左移后的结果是否会溢出,此时设计了一个long long型的数据来保存临时结果,这样就可以保证没有溢出。class Solution {public: int atoi(const char *str) { char *p = (char *)str; while (*p != '\0')原创 2013-12-11 20:33:48 · 344 阅读 · 0 评论 -
Binary Tree Postorder Traversal
/** * Definition for binary tree * struct TreeNode { * int val; * TreeNode *left; * TreeNode *right; * TreeNode(int x) : val(x), left(NULL), right(NULL) {} * }; */class Soluti原创 2013-12-11 20:39:57 · 402 阅读 · 1 评论 -
Merge Sorted Array
传说中的归并排序么……class Solution {public: void merge(int A[], int m, int B[], int n) { int *C = new int[m + n]; int ptr = 0; int i = 0, j = 0; while (i < m && j < n) { if (A[i] <= B[j]) {原创 2013-12-11 22:33:27 · 304 阅读 · 0 评论 -
Combination Sum
本题属于不知道循环层数的时候用递归的问题。几个要点,由于数字可以重复使用,因此下次开始的时候不是从下一个数放,而是从这次用过的这个数继续开始探测,如此便实现了数字无限次重复使用。vector在加元素的时候调用了拷贝构造函数,因此无需担心插入后再次被更改的情况。class Solution {public: vector > combinationSum(vector &can原创 2013-12-11 16:16:47 · 378 阅读 · 0 评论 -
Gray Code
这个思路简直太好了!n = k 时的格雷码,就是 n = k - 1 时的格雷码的逆序,再加上 1 class Solution {public: vector grayCode(int n) { vector res; res.push_back(0); for (int i = 0; i < n; ++i) {原创 2013-12-11 19:56:36 · 306 阅读 · 0 评论 -
Binary Tree Level Order Traversal
广搜的时候每一层加一个NULL节点俨然已经成了我的习惯……/** * Definition for binary tree * struct TreeNode { * int val; * TreeNode *left; * TreeNode *right; * TreeNode(int x) : val(x), left(NULL), right(原创 2013-12-11 21:55:26 · 358 阅读 · 0 评论 -
Best Time to Buy and Sell Stock III
最开始的时候想法是对的,由于要求至多只能买卖两次,因此我可以设计一个指针,依次指过每一天,将整个过程分成两个部分,前半部分只允许买卖一次,后半部分也只允许买卖一次,这样求得过程最大值即可。于是算下来复杂度是 O(n^2) 的量级。很明显,这样是过不了测试样例的,因为有更好的 O(n) 的方法的存在。于是我搜了一下别人的做法,发现这样的做法很好:“改进的方法就是动态规划了,那就是第一步扫描,原创 2013-12-12 17:49:12 · 620 阅读 · 0 评论 -
Add Two Numbers
在操作链表的时候在最前面加一个伪头是个很好的办法。/** * Definition for singly-linked list. * struct ListNode { * int val; * ListNode *next; * ListNode(int x) : val(x), next(NULL) {} * }; */class Solution原创 2013-12-12 11:13:21 · 353 阅读 · 0 评论 -
Trapping Rain Water
为什么我的思路总是和别人的不一样呢……具体想法是,设想这些墙都是排成一队的人,那么总有一个最高的墙,在这个墙左边,每个墙能存的雨水就和他向右看能看到的墙的个数有关,直到某一个比他还高的墙将他视线挡住为止。那么,在这两个比较高的墙之间,就是可以存雨水的部分。最高墙的右侧类似,只不过是需要向左看。因此,首先找到最高的墙是哪个,然后左右分开处理即可。class Solution {publ原创 2013-12-12 11:38:13 · 342 阅读 · 0 评论 -
Sort List
我之前一直想不明白这个题,归并排序我是想到的,但是我觉得归并怎么可能不利用额外的空间呢?后来看了高人解答以后恍然大悟,在对链表进行归并排序的时候,还真是不需要额外空间的!那么这个题就很简单了。本题的另一亮点就是,我学会了如何合并两个链表,在上一篇博文中我使用了异常复杂且容易出错的方法,而在这次的代码里,明显好理解了很多。主要就是另使用一个指针指向合并完成的部分,这样就完全类似于两个数组进行归并原创 2013-12-13 20:40:47 · 347 阅读 · 0 评论 -
Reorder List
这个题折磨了我不止一个小时……首先利用快慢指针,找到链表的中间节点,将前半部分保序,而后半部分逆转。之后,再将后半部分隔空插到前半部分中。难点在于链表的各种处理……/** * Definition for singly-linked list. * struct ListNode { * int val; * ListNode *next; * Lis原创 2013-12-13 19:54:26 · 363 阅读 · 0 评论 -
Remove Nth Node From End of List
今晚做的最顺的题有木有!一次过有木有!解决方案是,维护一个长度为n + 1的队列,如果超了的话,就把最前面的元素移出去。这样到链表遍历玩的时候,刚好队列头在需要删除的元素前面的位置。/** * Definition for singly-linked list. * struct ListNode { * int val; * ListNode *next; *原创 2013-12-13 22:22:07 · 317 阅读 · 0 评论 -
Search a 2D Matrix
好简单……就是写一个助手函数把一维二分查找转换成二维的就OK了。class Solution {public: bool searchMatrix(vector > &matrix, int target) { if (matrix.size() == 0) return false; if (matrix[0].size(原创 2013-12-13 23:19:14 · 319 阅读 · 0 评论 -
Insertion Sort List
我的代码好丑……算了能用就行了,关键的点是,多设几个变量吧,似乎也没什么不好。/** * Definition for singly-linked list. * struct ListNode { * int val; * ListNode *next; * ListNode(int x) : val(x), next(NULL) {} * }; *原创 2013-12-13 22:03:42 · 336 阅读 · 0 评论 -
Length of Last Word
理解了题意以后就很简单了。class Solution {public: int lengthOfLastWord(const char *s) { if (s == NULL) return 0; int n = strlen(s); int p = n - 1; while (p >= 0)原创 2013-12-13 23:33:14 · 350 阅读 · 0 评论 -
Path Sum II
没什么要说的。注意父节点在左右子树返回时可能被计算两次。/** * Definition for binary tree * struct TreeNode { * int val; * TreeNode *left; * TreeNode *right; * TreeNode(int x) : val(x), left(NULL), right(N原创 2013-12-14 00:01:39 · 352 阅读 · 0 评论 -
Palindrome Number
回文数,当然有很简单的办法,那就是无比强大的 sprintf_s,但是题目限制不能使用额外空间,那么只好按部就班取数的每一位,然后再判断是否相等。注意,负数无论如何也不能成为回文数,因为前面有负号。按部就班版:class Solution {public: bool isPalindrome(int x) { if (x == 0) return true; if原创 2013-12-14 00:24:48 · 328 阅读 · 0 评论 -
Next Permutation
这货就是个数学题……http://fisherlei.blogspot.com/2012/12/leetcode-next-permutation.htmclass Solution {public: void nextPermutation(vector &num) { if (num.size() == 0 || num.size() == 1)原创 2013-12-14 22:43:53 · 362 阅读 · 0 评论 -
Sort Colors
典型的计数排序。class Solution {public: void sortColors(int A[], int n) { int count[3] = {0}; for (int i = 0; i < n; ++i) count[A[i]]++; for (int i = 0; i < n; ++i)原创 2013-12-14 23:44:45 · 357 阅读 · 0 评论