LeetCode
程程程乘什么
这个作者很懒,什么都没留下…
展开
-
LeetCode 543:二叉树的直径
class Solution {public: int ans = 0; int diameterOfBinaryTree(TreeNode* root) { //ans = 1; dfs(root); return ans; } int dfs(TreeNode* root) { if(!ro...原创 2020-05-06 16:40:29 · 195 阅读 · 0 评论 -
LeetCode 31 数组的下一个排列
class Solution {public: void nextPermutation(vector<int>& nums) { int i = nums.size() - 2; while(i >= 0 && nums[i+1] <= nums[i]) { i--; ...原创 2020-05-06 16:32:05 · 127 阅读 · 0 评论 -
数据结构实现系列
一、两个栈实现一个队列class CQueue {public: CQueue() { } stack<int> s1, s2; void appendTail(int value) { s1.push(value); } int deleteHead() { if(!s2.em...原创 2020-05-06 15:55:14 · 127 阅读 · 0 评论 -
LeetCode 8:字符串转换成整数
需要考虑各种特殊情况特殊处理: int strToInt(string str) { int len = str.length(); int i = 0; long long num = 0; while(str[i] == ' ') { i++; } bool f...原创 2020-05-02 21:22:08 · 126 阅读 · 0 评论 -
算法题总结3:二分查找专题
剑指Offer 53-1原始版本:找到左右边界,再返回。(缺点:容易出错,比较麻烦)class Solution {public: int search(vector<int>& nums, int target) { const int n = nums.size(); int left = 0, right = n - ...原创 2020-04-28 23:13:34 · 315 阅读 · 0 评论 -
LeetCode :95/96 不同的二叉搜索树 (二叉搜索树组合的个数)
参考力扣上官方的题解,采用动态规划法,关键点在于:1、状态转移公式的推导;2、边界的处理:dp[0]也初始化为1,因为+=的存在,dp除0,1之外,后面的都要初始化为0class Solution {public: int numTrees(int n) { if(n <= 1) return n; vector<int>...原创 2020-02-28 21:44:57 · 203 阅读 · 0 评论 -
接雨水两题:LeetCode 42/407
42 接雨水-一维动态编程,存储每个位置向左与向右的最大值,实现O(n)的时间复杂度。有一个容易出错的地方:计算向左/右的最大高度时,要把自己本身的高度也计算进去。(但是我感觉不应该包括。。。)一开始不通过的代码:class Solution {public: int trap(vector<int>& height) { const...原创 2020-04-06 15:41:04 · 142 阅读 · 0 评论 -
回溯法系列:全排列系列问题、N皇后问题、矩阵中的路径、机器人的运动范围
class Solution {public: vector<vector<string>> solveNQueens(int n) { //vector<vector<string>> ans; vector<string> board(n, string(n, '.')); //初始化n*n...原创 2020-04-06 23:33:49 · 292 阅读 · 0 评论 -
LeetCode 999:车的可用捕获量
这道题只需要模拟题意即可。分方向讨论时也有一些基本的编程经验,如dx, dy方向数组分开设置比较方便。class Solution {public: int numRookCaptures(vector<vector<char>>& board) { if(board.size() != board[0].size()) return...原创 2020-03-27 00:05:34 · 104 阅读 · 0 评论 -
回文串/回文序列系列题:647回文子串个数/ 5最长回文子串/ 516最长回文子序列
647. 回文子串:计数字符串中回文子串的个数1、中心延展法:中心可以取为字母,或两个字母的间隙。class Solution {public: int countSubstrings(string s) { const int n = s.length(); int ans = 0; for(int i = 0; i < ...原创 2020-03-26 23:25:59 · 220 阅读 · 0 评论 -
贪心算法系列:435 无重叠区间 452 用最少数量的箭引爆气球
参考:https://labuladong.gitbook.io/algo/dong-tai-gui-hua-xi-lie/tan-xin-suan-fa-zhi-qu-jian-tiao-du-wen-ti贪心算法求解区间调度问题: 正确的思路其实很简单,可以分为以下三步: 从区间集合 intvs 中选择一个区间 x,这个 x 是在当前所有区间中结束最早的(end 最小)。...原创 2020-03-23 17:26:48 · 155 阅读 · 0 评论 -
DFS/BFS 系列:LC 365 水壶问题
方法1:BFS,C++版本写起来很繁琐,Python很简洁using PII = pair<int, int>; //分别是x, y中的水量,作为状态量class Solution {public: PII op(int index, const PII& cur, int x, int y) { switch (index) { ...原创 2020-03-22 21:37:04 · 434 阅读 · 0 评论 -
LeetCode 2:两数相加
一个不起眼的Bug来源:循环中再次定义的变量,会在本循环中覆盖之前的同名变量,而且每次循环之后会释放该变量。引发不能进位、错误进位两种错误。class Solution {public: ListNode* addTwoNumbers(ListNode* l1, ListNode* l2) { ListNode dummy(0); List...原创 2020-03-21 23:34:22 · 96 阅读 · 0 评论 -
LeetCode : 股票买卖进阶4道题
123:限制买卖次数为2Bug:变量命名用的不好引起了低级错误!不要用k表示常亮,容易在之后写错。class Solution {public: int maxProfit(vector<int>& prices) { const int n = prices.size(); if(n <= 1) return 0;...原创 2020-03-21 11:47:48 · 222 阅读 · 0 评论 -
LeetCode 994:腐烂的橘子
多源+BFS,代码也因此可以分为两阶段。Bug1 :注意边界case:如果一开始全是腐烂橘子,直接就是返回0而不应该是-1,因此引入变量ansBug2:基本语法问题,循环里定义的变量在循环结束后都释放了,因此ans定义在循环外class Solution {private: int cnt = 0; //网格中剩余1的个数,初始化为0 int dist[10][10...原创 2020-03-06 16:59:03 · 137 阅读 · 0 评论 -
LeetCode:1143 最长公共子序列 583 两个字符串的删除操作
因为处理边界的不方便,自己想出了用Padding技巧来做,注意在 if 语句中 i, j 要减一class Solution {public: int longestCommonSubsequence(string text1, string text2) { int m = text1.length(), n = text2.length(); ...原创 2020-02-27 22:32:49 · 187 阅读 · 0 评论 -
LeetCode:5 最长回文子串
这道题与516题有一定的相似,只是一个是回文子序列,返回的是长度。一个是回文子串,返回的是字符串。一个比较好的解法汇总:动态规划、Manacher 算法一开始看了别人的思路,但是自己怎么写都不通过,后来发现原因在于:dp[i][j] = len==1 || len==2 || dp[i+1][j-1] && (s[i] == s[j]); 没有加括号,导致的后果:...原创 2020-02-27 17:51:36 · 107 阅读 · 0 评论 -
LeetCode:516 最长回文子序列
典型的动态规划题,可以用递归、迭代两种形式来解。首先引用一篇讲子序列问题的好文章:子序列问题通用思路|最长回文子序列以下内容引自上文:子序列问题是常见的算法问题,而且并不好解决。首先,子序列问题本身就相对子串、子数组更困难一些,因为前者是不连续的序列,而后两者是连续的,就算穷举你都不一定会,更别说求解相关的算法问题了。而且,子序列问题很可能涉及到两个字符串,比如前文「最长...原创 2020-02-27 22:53:08 · 170 阅读 · 0 评论 -
LeetCode 198:打家劫舍
简单的DP问题,因为状态转移方程仅仅和当前元素的前几个节点有关,因此不需要维护一个dp一维数组,和跳台阶问题一样,仅仅需要维护几个元素即可。class Solution {public: int rob(vector<int>& nums) { if(nums.empty()) return 0; int n...原创 2020-02-26 17:25:00 · 103 阅读 · 0 评论 -
LeetCode:300 最长上升子序列 (最优方法是:动态规划 + 二分法)
第一种简单粗暴地解法:递归求解状态转移方程,属于Up-Down方法,因为子问题的重复求解,导致时间复杂度O(2^n)一个语法点:想用全局变量,可以直接设置类的成员变量,不应该像 java 那样用 static 静态变量!这一点很容易被忽视!class Solution {private: int max; int f(vector<int>&a...原创 2020-02-26 16:08:37 · 214 阅读 · 1 评论 -
LeetCode: 91 解码方法
这道题一开始以为是简单的递归问题,按照从前往后的顺序递归,总是在“10”这个输入上报错。按照从后向前的方法递归,应对短序列没有问题,但是面对长序列,因为存在大量重复计算,所以超时。如果用递归来做,应该用记忆化递归!class Solution {public: int numDecodings(string s) { //if(s == "0" || s =...原创 2020-02-27 23:59:08 · 838 阅读 · 0 评论 -
LeetCode:第177场周赛 1361
class Solution {public: bool validateBinaryTreeNodes(int n, vector<int>& leftChild, vector<int>& rightChild) { deque<int> q; q.push_back(0); ...原创 2020-02-23 15:47:16 · 99 阅读 · 0 评论 -
LeetCode:215 数组中第K大的数
class Solution {public: int findKthLargest(vector<int>& nums, int k) { if(nums.size() < k || k < 1) return -1; int left = 0, right = nums.size()-1; while(...原创 2020-02-22 16:36:18 · 222 阅读 · 0 评论 -
LeetCode 147:对链表进行插入排序
指针的操作比较繁琐复杂,需要捋清楚再写,中间犯了3个错误:class Solution {public: ListNode* insertionSortList(ListNode* head) { if(!head || !head->next) return head; //Bug2:不应该是nullptr,应该是head ListNod...原创 2020-02-22 12:20:49 · 153 阅读 · 1 评论 -
LeetCode:212 单词搜索Ⅱ
这道题是DFS+前缀树,是一道标准的模板题这里面的Tire类的定义写的方法与之前的208略有不同,但基本上一样。只是单独定义了一下TireNode节点类。//定义节点,类/结构体class TireNode {public: TireNode(){ } bool isEnd = false; vector<TireNode*> next...原创 2020-02-19 14:53:28 · 128 阅读 · 0 评论 -
LeetCode:208 实现字典树
基础的数据结构,实现方法完全可以根据思路背下来。class Trie {private: bool isEnd; Trie* next[26];public: /** Initialize your data structure here. */ Trie() { isEnd = false; memset(next, 0...原创 2020-02-18 13:05:29 · 117 阅读 · 0 评论 -
LeetCode 347:最高频的 K 个元素
很重点的一道题,是剑指Offer,LeetCode里面常见的另一道题:返回数组里最小/大的K个元素进阶版。同时也是海量数据处理课里讲过的一道基础题,后序还有各种进阶的在线解法。自己有思路但因为语法不够熟练,参考了讨论区的解法写的程序:涉及到了很多C++基础知识,值得好好复习。C++ STL 优先队列的应用缺点:最后是倒序输出的。class Solution {public:...原创 2020-02-07 15:15:52 · 153 阅读 · 0 评论 -
LeetCode 144,94,145:二叉树三种深度优先遍历
递归:class Solution {public: vector<int> preorderTraversal(TreeNode* root) { vector<int> res; if(!root) return res; preorder(root, res); return res;...原创 2020-02-07 11:31:52 · 154 阅读 · 0 评论 -
LeetCode 230:二叉搜索树中第K小的元素
最基础的解法:将整个二叉树中序遍历存入序列,取第k个(index = k-1)返回。如果是第k大就反向中序遍历。class Solution {public: int kthSmallest(TreeNode* root, int k) { if(!root) return 0; InorderTraversal(root); r...原创 2020-02-06 10:57:59 · 128 阅读 · 0 评论 -
LeetCode 250:同值子树的个数
深度优先搜索:直观上感觉是后序,但并不是严格的后序遍历Python实现:注意短路效应带来的bug,比较隐蔽class Solution: def countUnivalSubtrees(self, root: TreeNode) -> int: if root == None: return 0 self.count...原创 2020-02-03 11:26:24 · 284 阅读 · 0 评论 -
LeetCode 239:滑动窗口最大值
方法一:暴力法 ,时间复杂度O((n-k) * k)class Solution {public: vector<int> maxSlidingWindow(vector<int>& nums, int k) { if(nums.empty() || k<=1) return nums; vector<...原创 2020-02-03 00:20:35 · 108 阅读 · 0 评论 -
LeetCode 739:每日温度
解题思路有两点比较关键:1、想到用栈,而且栈中存放的是索引,而不是温度值2、打破思维桎梏,不是按顺序来计算D中每一个值的class Solution {public: vector<int> dailyTemperatures(vector<int>& T) { vector<int> D(T.size(), 0...原创 2020-02-02 22:37:11 · 119 阅读 · 0 评论 -
括号两题:Leet 20/22
利用栈作为辅助数据结构。注意:C++中char变量要用单引号'(' ,"("是字符串,即 char [2]class Solution {public: bool isValid(string s) { unordered_map<char, char> dict; dict.insert(pair<char, char>(...原创 2020-02-02 16:53:33 · 120 阅读 · 0 评论 -
LeetCode 234/9/125:回文链表,回文数,验证回文串
234:回文链表将链表存入数组再判断:Python有语法糖,不需要双指针法,直接就可以翻转比较。class Solution: def isPalindrome(self, head: ListNode) -> bool: array = [] currNode = head while currNode is not...原创 2020-02-02 14:58:39 · 111 阅读 · 0 评论 -
LeetCode 92:翻转链表 2
这道题乍一想觉得很简单,写完程序觉得自己的方法细节处理太繁琐了,改了两个比较隐蔽的Bug。对LeetCode测试样例可以通过,但是[3, 5],1,2这样的case就过不了,仔细推了一下,可能是prev没有在rear前面一个节点,而是和它同一个节点导致的。class Solution {public: ListNode* reverseBetween(ListNode* head...原创 2020-01-31 18:54:41 · 89 阅读 · 0 评论 -
LeetCode 206/24/25:一系列链表翻转问题
206. 翻转链表:加头结点,没有必要:class Solution {public: ListNode* reverseList(ListNode* head) { if(!head) return nullptr; ListNode dummy(0); dummy.next = head; ListNod...原创 2020-01-30 23:13:25 · 82 阅读 · 0 评论 -
LeetCode 242:有效的字母异位词
假期动手写的第一题!解法:采用数字数组计数对消的方法。在题解区叫这种方法为Hash表法,其实仔细想想确实是用一个数组实现的哈希表。class Solution {public: bool isAnagram(string s, string t) { if(s.length()!=t.length()) return false; vecto...原创 2020-01-30 15:14:44 · 73 阅读 · 0 评论 -
剑指Offe 50:数组中重复的数字
第一种方法:遍历一遍数组,依次放入hash表。一旦遇到一个元素哈希表中已经有了,就是第一个重复的数字。class Solution {public: bool duplicate(int numbers[], int length, int* duplication) { if(numbers == nullptr || length<=0 || dupli...原创 2019-12-08 23:32:05 · 137 阅读 · 0 评论 -
LeetCode 236:二叉树的最近公共祖先
看剑指Offer书上的解法,照葫芦画瓢写的程序,一开始运行出错,改了ans=*it1的顺序运行结果正确,但是提交后有case不通过:(代码的思路并没有完全理解)经过第一次试用LeetCode在线调试工具,打印中间变量找到问题所在:搜索路径没有把目标节点本身加入进去。class Solution {public: TreeNode* lowestCommonAncestor(Tr...原创 2019-11-26 23:04:49 · 106 阅读 · 0 评论 -
LeetCode 226:翻转二叉树
自己写的递归的解法,还是比较高效的。class Solution {public: TreeNode* invertTree(TreeNode* root) { if(root == nullptr) return nullptr; if(!root->left && !root->right) return root;...原创 2019-11-26 20:49:11 · 83 阅读 · 0 评论