
leetcode
文章平均质量分 51
夜淡
这个作者很懒,什么都没留下…
展开
-
865. 具有所有最深节点的最小子树
与“1123. 最深叶节点的最近公共祖先”题相同。求最深叶节点的lca就是求具有所有最深节点的最小子树。思路1:一遍dfs求最大深度,再来一遍dfs求这些深度最大的点的lcaclass Solution {public: int getDepth(TreeNode* root) { if (root) { int left = getDepth(root->left); int right = ge原创 2021-08-29 17:20:14 · 229 阅读 · 0 评论 -
1. Two Sum
题意给定一个数组和一个数,问数组里哪两个数相加之和等于这个数。思路开两个map,一个map记录某个数是否存在,一个map记录这个数的位置在哪里,找到之后return即可,时间复杂度O(nlogn)代码class Solution {public: vector<int> twoSum(vector<int>& nums, int target) ...原创 2019-02-20 16:29:58 · 132 阅读 · 0 评论 -
2. Add Two Numbers
题意用一个链表代表每个数,但是这个链表是反的。比如123就是3->2->1。给两个这样的链表,求这两个链表代表的数之和,也用链表表示。思路正常模拟即可。按低位到高位每次相加,不要忘了进位。时间复杂度O(n)代码/** * Definition for singly-linked list. * struct ListNode { * int val; * ...原创 2019-02-20 16:56:20 · 95 阅读 · 0 评论 -
3. Longest Substring Without Repeating Characters
题意在给定字符串中查找最长无重复字符的自传思路使用滑动窗口的思想。维护一个子串,该子串每次向右扩增,无重复字符就一直向右走。如果遇上了重复字符,那么找到这个字符前一个出现的位置,将这个位置以及它左边的字符全部抛弃。一直扩增到串尾,每向右移动一次则更新一次res。时间复杂度O(n)代码class Solution {public: int lengthOfLongestSu...原创 2019-02-20 19:12:56 · 89 阅读 · 0 评论 -
4. Median of Two Sorted Arrays
题意给两个有序数组,找到两个数组合并之后的中位数。时间复杂度要求限制在O(log (m+n))思路步骤1看到这个时间复杂度,就能想到应该使用二分的方法去解决。这个题目其实就是两个有序数组中,查询第K小的元素的问题。为了避免奇偶的问题,有如下小trick:长度为n的一列有序数,中位数为:x = (arr[(n-1)/2]+arr[n/2])/2 (假设数组arr第一个存储的位置为0...原创 2019-02-21 19:23:19 · 775 阅读 · 1 评论 -
5. Longest Palindromic Substring
题意在一个字符串中找最长回文子串思路manacher算法模板题时间复杂度O(n)代码int len[5005];class Solution {public: string longestPalindrome(string s) { string temp = "$#"; for (int i = 0; i < s.size(); i+...原创 2019-02-23 15:56:05 · 303 阅读 · 0 评论 -
6. ZigZag Conversion
题意按照题目所给的方式将字符串中的字符一个个摆放。摆放位置就是先一直向下,然后右上,再一直向下。思路第一想法,有点复杂啊这个字符串模拟,想开二维数组做。转念一想,这样直接暴力做时间和空间复杂度不都爆炸了吗,不行不行。开始寻找字符之间的关系。然后,十分轻松就找到了,在我最右边这一列,乱七八糟的数字记录着每一行,下一个要输出的字符距离当前字符的位置。很显然,如果记最大间隔为tot,t...原创 2019-02-23 16:29:36 · 92 阅读 · 0 评论 -
7. Reverse Integer
题意把一个int的数转过来题解坑有点多。第一个,转过来之后可能溢出,直接返回0。第二个,要消掉尾部0。代码class Solution {public: int reverse(int x) { string res; bool flag = false; if (x < 0) res += '-'; w...原创 2019-02-23 17:01:25 · 309 阅读 · 0 评论 -
8. String to Integer (atoi)
题意写一个自己的atoi函数,即把一个字符串转换成int类型的数思路在一遍一遍地踩坑中寻找AC。代码class Solution {public: int myAtoi(string str) { str.erase(0,str.find_first_not_of(" ")); if (str.size() == 0 || str[0] != '...原创 2019-02-23 17:47:43 · 93 阅读 · 0 评论 -
9. Palindrome Number
题意问一个int数是不是回文的代码class Solution {public: bool isPalindrome(int x) { string s = to_string(x); for (int i = 0; i < s.size(); i++) { if (s[i] != s[s.size()-...原创 2019-02-23 18:03:03 · 93 阅读 · 0 评论 -
10. Regular Expression Matching
题意给一个主串s和模式串p,看看s和p能否匹配。p串中存在 ‘.’ 号和 ‘*’ 号,分别代表一个任意字符,以及前一个字符出现任意次。思路1如图所示,根据p的size来分类递归处理。如果s和p都是空的,返回true如果p的大小为1的时候,s.size()==1时并且s[0]能与p[0]匹配时,返回true如果p的大小为2– 先看看p[1]是否是’*‘号,如果是的话,则不断将p[...原创 2019-02-27 00:02:14 · 305 阅读 · 0 评论 -
11. Container With Most Water
题意给定n个非负整数a1,a2,…,an,其中每个代表一个点坐标(i,ai)。n个垂直线段例如线段的两个端点在(i,ai)和(i,0)。找到两个线段,与x轴形成一个容器,使其包含最多的水。思路首先,任何情况下必然存在一个最优解,即一对线段形成包含最多水的容器。问题在于如何找到这一对线段。可以设置两根指针,分别指向第一个线段和最后一个线段,不断的向内移动,在移动的过程中,如果能途径这一对最优...原创 2019-03-02 00:38:59 · 109 阅读 · 0 评论 -
12. Integer to Roman
题意给定一个1——3999的自然数,转成罗马数。思路就按十进制数的int->string的思路。寻找从大到小依次遍历即可。代码class Solution {public: string res; int now; map<int, string> mp; void loop(int n) { while (n...原创 2019-03-02 16:09:26 · 77 阅读 · 0 评论 -
13. Roman to Integer
题意罗马数转成十进制数思路从左向右转换字符串即可代码class Solution {public: int romanToInt(string s) { int mp[200]; int res = 0; mp['I'] = 1; mp['V'] = 5; mp['X'] = 10; mp['L'] = 50; mp['C'] =...原创 2019-03-02 16:35:07 · 84 阅读 · 0 评论 -
14. Longest Common Prefix
题意给一个字符串数组,求得这些字符串的最长公共前缀思路二分答案。左边界为0, 右边界为所有字符串中最小的长度。每次尝试公共前缀是否可以达到长度为mid, 如果可以,left = mid + 1, 否则right = mid - 1。假设所有字符串中最小的长度为M, 字符串个数为N,时间复杂度为O(NMlogM)代码class Solution {public: string...原创 2019-03-05 20:41:09 · 112 阅读 · 0 评论 -
15. 3Sum
题意给一个数组,找到所有相加起来等于0的三个数集合。思路1假设a+b+c = 0,选定a,然后枚举b和c,为了减小时间复杂度,使用map来找确定了a,b,是否有剩下的那个能和ab相加为零的数。去重:使用set记录结果,防止有重复记录。时间复杂度:O(n^2logn)代码struct node{ int a, b, c; node(int q, int w, int e...原创 2019-03-07 00:06:58 · 101 阅读 · 0 评论 -
16. 3Sum Closest
题意找到数组中和最接近target的三个数,并返回这个和。思路排序后枚举第一个数,然后后面使用双指针法处理。时间复杂度:O(n^2)代码class Solution {public: int threeSumClosest(vector<int>& nums, int target) { sort(nums.begin(), nums.en...原创 2019-03-07 13:47:34 · 88 阅读 · 0 评论 -
17. Letter Combinations of a Phone Number
题意给一串数字,把有可能的对应字符串全部输出。思路递归会比较方便。时间复杂度:O(n)代码class Solution {public: vector<string> res; string mp[10] = {"", "", "abc", "def", "ghi", "jkl", "mno", "p原创 2019-03-07 15:09:12 · 78 阅读 · 0 评论 -
18. 4Sum
题意数组里找四个数相加之和为target,求所有的这样的四个数。思路和3sum一样。https://blog.youkuaiyun.com/j___t/article/details/88265203代码class Solution {public: vector&lt;vector&lt;int&gt;&gt; fourSum(vector&lt;int&gt;&amp; nums原创 2019-03-08 13:42:35 · 85 阅读 · 0 评论 -
19. Remove Nth Node From End of List
题意给一个链表,删除倒着数第n个节点思路正常模拟即可代码/** * Definition for singly-linked list. * struct ListNode { * int val; * ListNode *next; * ListNode(int x) : val(x), next(NULL) {} * }; */class So...原创 2019-03-08 14:01:23 · 72 阅读 · 0 评论 -
20. Valid Parentheses
题意给予含有小括号中括号和大括号的字符串,看是否合法。思路难点在于有不同的括号,括号中间不能有不合法的其他括号,例如 [ ( ] ) 是不合法的。我的思路就是检查到一对合法的括号,就直接删去,这样如果出现了一对匹配的括号之间仍有其他字符,则直接返回false,因为匹配的括号之间我们一定已经遍历过了,遍历过而还存在于字符串中,必然是非法的,如上面这个例子。所以我们只要记录下来,三种括号每种的...原创 2019-03-08 16:47:21 · 112 阅读 · 0 评论 -
21. Merge Two Sorted Lists
代码/** * Definition for singly-linked list. * struct ListNode { * int val; * ListNode *next; * ListNode(int x) : val(x), next(NULL) {} * }; */class Solution {public: ListNode*...原创 2019-03-08 18:08:02 · 129 阅读 · 0 评论 -
22. Generate Parentheses
题意给一个数字n,求所有n对小括号的所有合法表达式思路递归处理,只要在递归过程中,保证右边符号数量不大于左边符号数目即可。代码class Solution {public: vector<string> res; void dfs(string now, int left, int right, int n) { if (left +...原创 2019-03-08 19:00:17 · 88 阅读 · 0 评论 -
23. Merge k Sorted Lists
题意给予n个有序链表,合并它们。思路1那肯定是把所有数拿出来排个序啊哈哈哈。时间复杂度:O(nlogn)代码/** * Definition for singly-linked list. * struct ListNode { * int val; * ListNode *next; * ListNode(int x) : val(x), next(...原创 2019-03-09 14:08:26 · 107 阅读 · 0 评论 -
24. Swap Nodes in Pairs
题意两个两个交换链表中的元素思路建一个dummy头结点,操作会方便很多。画画图就知道该怎么改next链了。代码/** * Definition for singly-linked list. * struct ListNode { * int val; * ListNode *next; * ListNode(int x) : val(x), next...原创 2019-03-10 13:41:22 · 83 阅读 · 0 评论 -
25. Reverse Nodes in k-Group
题意给一个链表和一个数字k,实现每k个节点翻转一次。思路首先明确在这个任务中,有三个部分第一个,将每一块k个节点的链表反转,可以使用递归简单的完成。第二个,之前指向这一块的那个指针现在要指向新的节点了,比如图上,本来指向5的指针要指向7。第三个,本来7是指向下一个块的第一个元素,现在需要5来指向下一块的最后一个元素(因为下一块也需要进行反转)。时间复杂度O(n), 空间复杂度O(...原创 2019-03-10 17:11:15 · 123 阅读 · 0 评论 -
26. Remove Duplicates from Sorted Array
题意使用空间复杂度为O(1)的算法来对已排好序的数组进行去重。要注意的是,如果去重后只有k个数,必须要保证前k个数有序排在数组里的前k个位置。思路这不就是unique函数干的事情嘛哈哈哈哈!代码class Solution {public: int removeDuplicates(vector&lt;int&gt;&amp; nums) { return u...原创 2019-03-14 12:42:25 · 99 阅读 · 0 评论 -
27. Remove Element
题意删除数组里所有值为给定val的元素。思路1不断寻找,找到就删。时间复杂度:O(n^2)代码class Solution {public: int removeElement(vector<int>& nums, int val) { int i = 0, len = nums.size(); while (i < ...原创 2019-03-15 00:55:22 · 98 阅读 · 0 评论 -
28. Implement strStr()
题意求p串在s串中的出现位置思路扩展KMP算法,时间复杂度:O(n)代码class Solution {public: int strStr(string haystack, string needle) { if (needle.size() == 0) return 0; int next[100005]; next[0] =...原创 2019-03-16 21:18:52 · 112 阅读 · 0 评论 -
29. Divide Two Integers
题意不使用乘除取余运算求解两个数的商。思路将两个数看成两个二进制的数,由于负数的二进制和负数在计算机中的存储(补码)是不同的,而正数的二进制和正数在计算机中的存储(补码)是相同的,所以我们把dividend (a) 和divisor (b) 都先处理成正数。但是对于INT_MIN来说,它的绝对值是无法用int表示的,所以,对于a和b是INT_MIN的情况需要先处理掉。如果b是INT_MIN...原创 2019-03-17 21:24:01 · 123 阅读 · 0 评论 -
30. Substring with Concatenation of All Words
题意给一个字符串数组,数组中的字符串可以任意组合,但每个字符串必须参与仅1次组合。求s串中出现组合串的所有下标。思路首先想到的就是拿所有可能的组合,然后用s.find()或是KMP来找所有可能的下标,但是这样的时间复杂度太高了,如果字符串个数为n,长度为l,s串的长度为s,则时间复杂度为O(n!(n*l+s))那么可以确定一点,去弄出所有字符串组合的做法基本是不可取的。比较好的一个做法就...原创 2019-03-19 01:52:53 · 93 阅读 · 0 评论 -
31. Next Permutation
题意给一串数字,找到字典序中刚好比这一串数字大的一种新排列思路从后向前找,找到第一个后一位比前一位大的地方,然后把这个位置标为x,则找到x——num.end()中比nums[x-1]要大,并且最小的数字,与nums[x-1]交换,然后再把nums[x ~ nums.end()]排序即可。时间复杂度:O(nlogn)代码class Solution {public: int f...原创 2019-03-19 13:44:40 · 126 阅读 · 0 评论 -
32. Longest Valid Parentheses
题意在一个括号字符串中寻找最长的合法串长度题意看到这种求最长的子串题目,就会想到dp。如果用f[i]表示以下标为i的字符为结尾的最长合法字符串的长度。那么f[i]和f[i-1]的关系又是什么呢?很显然,因为f[i-1]表示以i-1为下标的字符为结尾的最长合法括号串的长度,也就是说:s[i - 1 - f[i-1] + 1] ~ s[i - 1]是一个合法括号串那么,如果当下读入的是...原创 2019-03-24 00:43:59 · 99 阅读 · 0 评论 -
33. Search in Rotated Sorted Array
题意给一个有序数组,在一个特定的未知位置旋转一次。要求在logn的时间内找到target。思路先找到在哪里进行旋转,然后根据范围在左半部分或者右半部分二分查找。代码class Solution {public: int jtfind(vector<int>& nums, int t, int left, int right) { if...原创 2019-03-24 15:09:13 · 141 阅读 · 0 评论 -
34. Find First and Last Position of Element in Sorted Array
题意logn时间内找到一个有序数组内值为target的区间。思路两次二分即可。代码class Solution {public: vector<int> searchRange(vector<int>& nums, int target) { if (!nums.size()) return vector<int>{-...原创 2019-03-24 15:18:58 · 124 阅读 · 0 评论 -
35. Search Insert Position
class Solution {public: int searchInsert(vector<int>& nums, int target) { if (!nums.size()) return 0; int left = 0, right = nums.size()-1; while (left <= righ...原创 2019-03-24 15:22:42 · 132 阅读 · 0 评论 -
36. Valid Sudoku
题意给一个9*9的数独棋盘,看目前的数字合不合法。思路顺序判断。代码class Solution {public: bool isValidSudoku(vector<vector<char>>& board) { bool mp[100]; int i, j, k; for (i = 0; i &...原创 2019-03-24 16:03:48 · 125 阅读 · 0 评论 -
37. Sudoku Solver
题意完成数独思路暴力搜索代码class Solution {public: vector<vector<char>> res; bool legal(vector<vector<char>>& board, int x, int y, char c) { int i, j; ...原创 2019-03-29 00:52:47 · 76 阅读 · 0 评论 -
38. Count and Say
题意从初始串"1"开始,每次数串中所有元素个数,并把这作为新串思路正常模拟代码class Solution {public: string countAndSay(int n) { string s = "1"; for (int i = 2; i <= n; i++) { string temp;...原创 2019-04-05 22:53:53 · 133 阅读 · 0 评论 -
39. Combination Sum
题意给一串数,找出所有和为target的组合,每个数可以被重复用思路暴力搜索即可时间复杂度:O(n!)代码class Solution {public: vector<vector<int> > res; vector<int> temp; void dfs(int now, int sum, vector<int&g...原创 2019-04-06 19:13:56 · 88 阅读 · 0 评论