![](https://img-blog.csdnimg.cn/20201014180756754.png?x-oss-process=image/resize,m_fixed,h_64,w_64)
LeetCode
董洞洞同学
这个作者很懒,什么都没留下…
展开
-
LeetCode 42. 接雨水
方法一:(三次循环)当前柱子上方能积多少水,取决于三个变量,当前高度height[i],左边最高高度left_max[i],右边最高高度right_max[i]。积的水取决于min(left_max[i], right_max[i]) - height[i]0和n需要特判class Solution {public: int trap(vector<int>& height) { int n = height.size(),ans = 0;原创 2020-12-05 23:41:55 · 110 阅读 · 2 评论 -
LeetCode 41. 缺失的第一个正数
class Solution {public: int firstMissingPositive(vector<int>& nums) { unordered_set<int> hash; for(auto x: nums) hash.insert(x); int res = 1; while(hash.count(res)) res ++; return res; }};原创 2020-11-17 09:52:08 · 53 阅读 · 0 评论 -
LeetCode 40. 组合总和 II
class Solution {public: vector<vector<int>> ans; vector<int> path; vector<vector<int>> combinationSum2(vector<int>& candidates, int target) { sort(candidates.begin(), candidates.end());原创 2020-11-17 09:34:33 · 52 阅读 · 0 评论 -
LeetCode 39. 组合总和
class Solution {public: vector<vector<int>> ans; vector<int> path; vector<vector<int>> combinationSum(vector<int>& candidates, int target) { dfs(candidates, 0, target); return ans; }原创 2020-11-16 21:33:41 · 47 阅读 · 0 评论 -
LeetCode 38. 外观数列
class Solution {public: string countAndSay(int n) { string s = "1"; for(int i = 0; i < n - 1; i ++) { string t; // 双指针算法 for(int j = 0; j < s.size();) { int原创 2020-11-16 18:09:48 · 103 阅读 · 0 评论 -
LeetCode 37. 解数独
class Solution {public: bool row[9][9], col[9][9], cell[3][3][9]; void solveSudoku(vector<vector<char>>& board) { memset(row, 0, sizeof row); memset(col, 0, sizeof col); memset(cell, 0, sizeof cell);原创 2020-11-16 16:49:58 · 56 阅读 · 0 评论 -
LeetCode 36. 有效的数独
class Solution {public: bool isValidSudoku(vector<vector<char>>& board) { bool st[9]; // 判断行 for(int i = 0; i < 9; i ++) { memset(st, 0, sizeof st); for(int j = 0; j < 9; j原创 2020-11-16 10:22:16 · 76 阅读 · 0 评论 -
LeetCode 35. 搜索插入位置
class Solution {public: int searchInsert(vector<int>& nums, int target) { if(nums.empty()) return 0; int l = 0, r = nums.size() - 1; while(l < r) { int mid = l + r >> 1; if(num原创 2020-11-15 19:00:40 · 2457 阅读 · 0 评论 -
LeetCode 34. 在排序数组中查找元素的第一个和最后一个位置
class Solution {public: vector<int> searchRange(vector<int>& nums, int target) { if(nums.empty()) return {-1, -1}; int l = 0, r = nums.size() - 1; while(l < r) { int mid = l + r >>原创 2020-11-15 18:44:43 · 53 阅读 · 0 评论 -
LeetCode 33. 搜索旋转排序数组
class Solution {public: int search(vector<int>& nums, int target) { if(nums.empty()) return -1; int l = 0, r = nums.size() - 1; // 寻找两端数组的边界 while(l < r) { int mid = l + r + 1 >> 1原创 2020-11-15 17:54:18 · 59 阅读 · 0 评论 -
LeetCode 32. 最长有效括号
左右括号匹配:1.整个序列左右括号数量相等2.任意子序列中,左括号数量大于等于右括号数量性质:任何合法的序列不会横跨右括号数量大于左括号数量的子区间。证明:思路:1.怎么去分段?找到一段,右括号数量大于左括号数量的2.枚举以右括号为右端点,最长的左括号的长度。然后在这些长度里最长的结果就是所求问题:怎么去找最长的左括号长度呢class Solution {public: int longestValidParentheses(string s) { st原创 2020-11-15 15:56:38 · 67 阅读 · 0 评论 -
LeetCode 31. 下一个排列
思路:1.从后往前遍历,找到第一个升序2.如果没有,把原排列翻转一下3.如果有,在后面的序列中找到比[k-1]大,但比[k]小的数class Solution {public: void nextPermutation(vector<int>& nums) { int k = nums.size() - 1; while(k > 0 && nums[k - 1] >= nums[k]) k --;原创 2020-11-11 10:52:04 · 58 阅读 · 0 评论 -
LeetCode 30. 串联所有单词的子串
复杂度O(w*n),n是s串的长度(s.size()),w是word的长度(words[0].size()),m是有几个word(words.size())枚举起始位置,理论上O(n)个算法复杂度O(n/w * w * w),首先分组n/w,哈希插入弹出w,总共有w组 (如果是字符串哈希是O(n)的)如何判断两个集合相等?两个措施,看集合(哈希表)里单词的数量是不是相等;再引入一个外部变量,统计总单词个数。class Solution {public: vector<int>原创 2020-11-09 12:49:53 · 143 阅读 · 0 评论 -
LeetCode 29. 两数相除
首先想到的做法。设x是被除数,y是除数,x-y循环减,并计数,直到x<y停止。那么计的数就是商。如果x=2^31, y=1。那么计算的时间复杂度完全没有办法接受。将商表示为二进制,那么运算复杂度最多可以减少至31次。class Solution {public: int divide(int dividend, int divisor) { typedef long long LL; bool is_minus = false; if(d原创 2020-10-29 19:28:12 · 54 阅读 · 0 评论 -
LeetCode 28. 实现 strStr()
class Solution {public: int strStr(string haystack, string needle) { if(needle.empty()) return 0; int m = haystack.size(), n = needle.size(); haystack = ' ' + haystack, needle = ' ' + needle; vector<int> ne(n +原创 2020-10-28 21:59:00 · 53 阅读 · 0 评论 -
LeetCode 27. 移除元素
class Solution {public: int removeElement(vector<int>& nums, int val) { int k= 0; for(int i = 0; i < nums.size(); i ++){ if(nums[i] != val) nums[k ++] = nums[i]; } return k; }};原创 2020-10-14 10:02:56 · 53 阅读 · 0 评论 -
LeetCode 26. 删除排序数组中的重复项
class Solution {public: int removeDuplicates(vector<int>& nums) { int k = 0; for(int i = 0; i < nums.size(); i ++){ if(!i || nums[i] != nums[i - 1]) nums[k ++] = nums[i]; } return k; }};原创 2020-10-13 11:29:54 · 54 阅读 · 0 评论 -
LeetCode 25. K 个一组翻转链表
算法步骤:1.先让k内部的指针方向改变2.令c = p->next,然后p->next = a,c->next = b,更新p = c/** * Definition for singly-linked list. * struct ListNode { * int val; * ListNode *next; * ListNode() : val(0), next(nullptr) {} * ListNode(int x) : val(x原创 2020-10-13 11:02:59 · 53 阅读 · 0 评论 -
LeetCode 24. 两两交换链表中的节点
/** * Definition for singly-linked list. * struct ListNode { * int val; * ListNode *next; * ListNode() : val(0), next(nullptr) {} * ListNode(int x) : val(x), next(nullptr) {} * ListNode(int x, ListNode *next) : val(x), next(next.原创 2020-10-13 10:08:54 · 86 阅读 · 0 评论 -
LeetCode 23. 合并K个排序链表
怎么找几个序列的最小值?如果用while循环来做,假设所有序列的总长度加起来是n。每加一个元素就要循环k次(k个指针),总体的复杂度O(nk)用堆来寻找最小值,用堆来维护k个指针。每次取出堆中最小值的复杂度O(1)O(1)O(1)。把指针往后移动一...原创 2020-10-12 21:38:23 · 54 阅读 · 0 评论 -
LeetCode 22. 括号生成
本题的条件:1.任意前缀中 “(” 数量 >= ")"数量2.左右括号数量相等如果题目求的不是具体的方案,而是方案数量。可以直接用卡特兰公式Cmnn+1\frac{C^n_m}{n + 1}n+1Cmn分析:1.什么时候可以填左括号?当左括号数量小于n2.什么时候可以填右括号?右括号数量小于n && 左括号数量大于右括号数量(必须是严格大于,因为如果有等于,当加入右括号的时候,右括号数量就大于左边了)算法的复杂度为Cmnn+1∗2n\frac{C^n_m}{n+1}*原创 2020-10-12 19:08:49 · 56 阅读 · 0 评论 -
LeetCode 21. 合并两个有序链表
/** * Definition for singly-linked list. * struct ListNode { * int val; * ListNode *next; * ListNode() : val(0), next(nullptr) {} * ListNode(int x) : val(x), next(nullptr) {} * ListNode(int x, ListNode *next) : val(x), next(next)原创 2020-10-12 18:14:27 · 52 阅读 · 0 评论 -
LeetCode 20. 有效的括号
class Solution {public: bool isValid(string s) { stack<int> stk; for(int i = 0; i < s.size(); i ++){ if(s[i] == '(' || s[i] == '[' || s[i] == '{') stk.push(s[i]); else{ if(stk.size() &am原创 2020-10-11 11:34:49 · 68 阅读 · 0 评论 -
LeetCode 19. 删除链表的倒数第N个节点
由于可能需要动头节点,那么需要建一个虚拟节点/** * Definition for singly-linked list. * struct ListNode { * int val; * ListNode *next; * ListNode() : val(0), next(nullptr) {} * ListNode(int x) : val(x), next(nullptr) {} * ListNode(int x, ListNode *nex原创 2020-10-11 10:47:52 · 55 阅读 · 0 评论 -
LeetCode 18. 四数之和
两数之和,直接双指针三数之和,枚举一个数四数之和,枚举两个数五数之和,枚举三个数…如果要枚举n个数,动态规划class Solution {public: vector<vector<int>> fourSum(vector<int>& nums, int target) { sort(nums.begin(), nums.end()); vector<vector<int>> res;原创 2020-10-09 21:19:07 · 50 阅读 · 0 评论 -
LeetCode 16. 最接近的三数之和
class Solution {public: int threeSumClosest(vector<int>& nums, int target) { int ans = nums[0] + nums[1] + nums[2]; sort(nums.begin(), nums.end()); for(int i = 0; i < nums.size(); i ++){ int l = i + 1,原创 2020-10-09 17:40:05 · 57 阅读 · 0 评论 -
LeetCode 17. 电话号码的字母组合
枚举全排列,dfsclass Solution {public: vector<string> ans; string strs[10] = { "", "", "abc", "def", "ghi", "jkl", "mno", "pqrs", "tuv", "wxyz" }; vector<string> letterCombinations(string digits) { i原创 2020-10-09 17:39:15 · 52 阅读 · 0 评论 -
LeetCode 15. 三数之和
双指针算法一定要有序原始做法暴力枚举复杂度O(n3)O(n^3)O(n3)双指针算法复杂度O(n2)O(n^2)O(n2)步骤:假设i<j<ki<j<ki<j<k对原数组进行排序枚举一遍iii,复杂度O(n)O(n)O(n)双指针枚举,复杂度O(n)O(n)O(n),同时判断条件是否成立存入符合条件的值...原创 2020-10-09 13:53:27 · 44 阅读 · 0 评论 -
LeetCode 14. 最长公共前缀
class Solution {public: string longestCommonPrefix(vector<string>& strs) { string res; if(strs.empty()) return res; for(int i = 0;; i ++){ if(i >= strs[0].size()) return res; char c = strs[原创 2020-10-09 09:53:11 · 50 阅读 · 0 评论 -
LeetCode 13. 罗马数字转整数
class Solution {public: int romanToInt(string s) { unordered_map<char, int> hash; hash['I'] = 1, hash['V'] = 5; hash['X'] = 10, hash['L'] = 50; hash['C'] = 100, hash['D'] = 500; hash['M'] = 1000;原创 2020-10-08 12:32:51 · 103 阅读 · 0 评论 -
LeetCode 12. 整数转罗马数字
class Solution {public: string intToRoman(int num) { int value[] = { 1000, 900, 500, 400, 100, 90, 50, 40, 10, 9, 5, 4, 1 }; string repre[] = { "M", "CM",原创 2020-10-08 11:45:27 · 68 阅读 · 0 评论 -
LeetCode 11. 盛最多水的容器
算法流程:1.两个指针分别位于初始位置和结束位置2.指针值偏小的一方往里走,同时计算面积最大值为什么要指针值偏小的往里走?假设左侧指针先到达最优位置(右侧同理,证明略)。如果右侧指针比左侧大,右侧指针不应该移动。理由是,假设存在右侧最优面积,右侧最优值(右边第二个线)无论是比左侧最优值高还是低,构成的面积均小于最右侧指针构成的面积。所以出现矛盾。而右侧指针比左侧小的话,就要往里走,计算比较一下可能的面积大小。class Solution {public: int maxArea(vec原创 2020-10-08 10:48:30 · 51 阅读 · 0 评论 -
LeetCode 10. 正则表达式匹配
动态规划解题要考虑状态表示和状态计算状态表示分为集合含义和输出属性本题用f(i,j)f(i,j)f(i,j)状态表示,sss是原字符串,ppp是字符规律字符串集合:所有s[1∼i]s[1 \sim i]s[1∼i]和p[1∼j]p[1 \sim j]p[1∼j]的匹配方案属性:bool值,是否存在一个合法方案状态计算1.如果p[j]≠′∗′p[j] \neq '*'p[j]=′∗′,那么f(i,j)=(p[i]==p[j]∣∣p[j]==′.′)&&f[i−1,j−1]f(i原创 2020-10-07 21:53:41 · 1000 阅读 · 4 评论 -
LeetCode 9. 回文数
// 用字符串(题目禁止)class Solution {public: bool isPalindrome(int x) { if(x < 0) return false; string s = to_string(x); return s == string(s.rbegin(), s.rend()); }};class Solution {public: bool isPalindrome(int x) {原创 2020-09-30 10:34:54 · 59 阅读 · 0 评论 -
LeetCode 8. 字符串转换整数 (atoi)
// long long 版本class Solution {public: int myAtoi(string str) { int k = 0; while(k < str.size() && str[k] == ' ') k ++; int minus = 1; if(str[k] == '-') minus = -1, k ++; else if(str[k] == '+') k ++原创 2020-09-30 09:37:44 · 62 阅读 · 0 评论 -
LeetCode 7. 整数反转
补充使用的额外知识:1.秦九昭算法,核心思想:求n阶多项式能够转为计算n次一阶多项式。方便计算机递归处理2.c++ int的范围:[−231∼231−1][-2^{31} \sim 2^{31} - 1][−231∼231−1],eg.整型2147483647在这个范围里,但是翻转以后7463847412就超出int的范围了。所以本题会提出要求,数据要int存储的下。3.c++ 中负数取模得到的还是一个负数// 不考虑int范围版本class Solution {public: in原创 2020-09-28 13:00:27 · 84 阅读 · 0 评论 -
LeetCode 6. Z 字形变换
class Solution {public: string convert(string s, int numRows) { string res; if(numRows == 1) return s; for(int i = 0; i < numRows; i ++){ if(i == 0 || i == numRows - 1){ for(int j = i; j < s.si原创 2020-09-27 00:46:37 · 78 阅读 · 0 评论 -
LeetCode 5. 最长回文子串
class Solution {public: string longestPalindrome(string s) { string res; for(int i = 0; i < s.size(); i ++){ int l = i - 1, r = i + 1; while(l >= 0 && r < s.size() && s[l] == s[r]) l --,原创 2020-09-24 21:18:57 · 52 阅读 · 0 评论 -
LeetCode4.寻找两个正序数组的中位数
AB是从小到大排列好的k=(n+m)/2情况一:如果A[k/2]小于B[k/2],假如中位数取A[k/2],在B中小于A[k/2]的个数不足k/2,综合AB两列加起来小于A[k/2]的个数不足k,中位数的假设不成立。所以中位数不在A的左半段可以舍去情况二:如果A[k/2]大于B[k/2]。假如中位数取B[k/2],在A中小于B[k/2]的个数不足k/2,综合AB两列加起来小于B[k/2]的个数不足k,中位数的假设不成立。所以中位数不在B的左半段可以舍去情况三:如果A[k/2]等于B[k/2].原创 2020-09-20 22:45:55 · 54 阅读 · 0 评论 -
LeetCode3. 无重复字符的最长子串
双指针(滑动窗口算法)区间[j,i]i往后走,j只有两种选择原地或者往后走class Solution {public: int lengthOfLongestSubstring(string s) { unordered_map<char, int> hash; int res = 0; for(int i = 0, j =0; i < s.size(); i ++){ hash[s[i]] ++;原创 2020-09-03 23:15:32 · 52 阅读 · 0 评论