合集-代码训练
摘要:704. 二分查找 题目链接:https://leetcode.cn/problems/binary-search/ 文章讲解:https://programmercarl.com/0704.二分查找.html 简单的二分查找法,核心是认识区间的意义,注意以下几点: middle=low+(high
阅读全文
摘要:977.有序数组的平方 给你一个按 非递减顺序 排序的整数数组 nums,返回 每个数字的平方 组成的新数组,要求也按 非递减顺序 排序。 题目链接:https://leetcode.cn/problems/squares-of-a-sorted-array/ 错误的vector遍历方式,这会导致访
阅读全文
摘要:203.移除链表元素 给你一个链表的头节点 head 和一个整数 val ,请你删除链表中所有满足 Node.val == val 的节点,并返回 新的头节点 。 题目链接:203. 移除链表元素 - 力扣(LeetCode) 注意c++中NULL和nullptr的区别。应该用nullptr来表示空
阅读全文
摘要:24. 两两交换链表中的节点 给你一个链表,两两交换其中相邻的节点,并返回交换后链表的头节点。你必须在不修改节点内部的值的情况下完成本题(即,只能进行节点交换)。 题目链接:24. 两两交换链表中的节点 - 力扣(LeetCode) 建议画图,会更清晰一些。同时注意交换问题要用两个临时节点。 cla
阅读全文
摘要:哈希表理论基础 242.有效的字母异位词 给定两个字符串 s 和 t ,编写一个函数来判断 t 是否是 s 的字母异位词。 注意:若 s 和 t 中每个字符出现的次数都相同,则称 s 和 t 互为字母异位词。 示例 1: 输入: s = "anagram", t = "nagaram" 输出: tr
阅读全文
摘要:454.四数相加II 给你四个整数数组 nums1、nums2、nums3 和 nums4 ,数组长度都是 n ,请你计算有多少个元组 (i, j, k, l) 能满足: 0 <= i, j, k, l < n nums1[i] + nums2[j] + nums3[k] + nums4[l] ==
阅读全文
摘要:反转字符串 编写一个函数,其作用是将输入的字符串反转过来。输入字符串以字符数组 s 的形式给出。 不要给另外的数组分配额外的空间,你必须原地修改输入数组、使用 O(1) 的额外空间解决这一问题。 题目链接:344. 反转字符串 - 力扣(LeetCode) 关于是否用reverse函数解决问题:如果
阅读全文
摘要:28. 实现 strStr() 给你两个字符串 haystack 和 needle ,请你在 haystack 字符串中找出 needle 字符串的第一个匹配项的下标(下标从 0 开始)。如果 needle 不是 haystack 的一部分,则返回 -1 。 题目链接:28. 找出字符串中第一个匹配
阅读全文
摘要:堆栈理论基础 代码随想录 (programmercarl.com) STL中栈往往不被归类为容器,而被归类为container adapter(容器适配器)。栈的内部结构,栈的底层实现可以是vector,deque,list 都是可以的, 主要就是数组和链表的底层实现。 我们常用的SGI STL,如
阅读全文
摘要:20. 有效的括号 给定一个只包括 '(',')','{','}','[',']' 的字符串 s ,判断字符串是否有效。 有效字符串需满足: 左括号必须用相同类型的右括号闭合。 左括号必须以正确的顺序闭合。 每个右括号都有一个对应的相同类型的左括号。 题目链接:20. 有效的括号 - 力扣(Leet
阅读全文
摘要:239. 滑动窗口最大值 题目链接:239. 滑动窗口最大值 - 力扣(LeetCode) 给你一个整数数组 nums,有一个大小为 k 的滑动窗口从数组的最左侧移动到数组的最右侧。你只可以看到在滑动窗口内的 k 个数字。滑动窗口每次只向右移动一位。 返回 滑动窗口中的最大值 。 思路:首先在不考虑
阅读全文
摘要:理论基础 代码随想录 (programmercarl.com) 二叉树的链接形式定义(防忘) struct TreeNode { int val; TreeNode *left; TreeNode *right; TreeNode(int x) : val(x), left(NULL), right
阅读全文
摘要:层序遍历 102. 二叉树的层序遍历 - 力扣(LeetCode) 思路:结合了昨天学到的标记法,每当一层遍历完,向队列中添加一个NULL标记。遍历到NULL节点表示该层遍历完了,将结果存入结果集中。 /** * Definition for a binary tree node. * struct
阅读全文
摘要:104.二叉树的最大深度 题目链接:104. 二叉树的最大深度 - 力扣(LeetCode)n叉树也一样 思路:我的普通递归方法 class Solution { public: int depth(TreeNode* node,int d){ int l=0,r=0; if(node->left=
阅读全文
摘要:110.平衡二叉树 题目链接:110. 平衡二叉树 - 力扣(LeetCode) 思路:判断平衡二叉树,就是判断两个子树的高度差,继而问题转化为了如何求子树的高度——后序遍历(主要卡在了这里)。递归函数返回的是树的高度,同时用-1来表示退出递归(一开始想着用bool型作为返回值,发现函数不好设计)。
阅读全文
摘要:513.找树左下角的值 题目链接:513. 找树左下角的值 - 力扣(LeetCode) 思路:利用层序遍历,找到最后一层在输出第一个节点 class Solution { public: int findBottomLeftValue(TreeNode* root) { queue<TreeNod
阅读全文
摘要:654.最大二叉树 题目链接:654. 最大二叉树 - 力扣(LeetCode) 思路:普通递,每层递归的思想和快排有类似之处,同时终止条件也和快排相似。但我的写法效率很低。 class Solution { public: TreeNode* traversal(vector<int>nums,i
阅读全文
摘要:530.二叉搜索树的最小绝对差 题目链接:530. 二叉搜索树的最小绝对差 - 力扣(LeetCode) 思路:由于是二叉搜索树,先用中序遍历将节点存入数组中,再遍历数组相邻元素即可。 class Solution { public: void qianxu(TreeNode* root,vecto
阅读全文
摘要:二叉搜索树的最近公共祖先 题目链接:235. 二叉搜索树的最近公共祖先 - 力扣(LeetCode) 思路:只要利用二叉搜索树特性,只要当前节点的值位于要求的两个节点之间,就必定是我们要找的节点。最简单的一集。 class Solution { public: TreeNode* lowestCom
阅读全文
摘要:669.修剪二叉搜索树 题目链接:669. 修剪二叉搜索树 - 力扣(LeetCode) 思路:本题原来想沿用上一次最后一道题的思路,用删除二叉搜索树特定值节点的方法来解决,但是会报错,找不出问题所在(在评论区也是一堆套用450代码报错的)。只能参考官网答案了。 官网的方法没有用delete,但是思
阅读全文
摘要:回溯理论基础 回溯法,与递归有类似形式,本质是穷举(可能存在剪枝),效率并不高。 回溯的模板: void backtracking(参数) { if (终止条件) { 存放结果; return; } for (选择:本层集合中元素(树中节点孩子的数量就是集合的大小)) { 处理节点; backtra
阅读全文
摘要:组合总和III 题目链接:216. 组合总和 III - 力扣(LeetCode) 思路:仿照昨天的递归模板写的,同样是for循环横向遍历,递归纵向遍历。注意当k>n时要直接跳出,否则会判断栈溢出。 额外发现一个问题就是在累加sum时,用for(auto i:path)sum+=path[i];会出
阅读全文
摘要:组合总和 题目链接:39. 组合总和 - 力扣(LeetCode) 思路:依然一是套用回溯模板,但是我们这里用回溯的是i而不是i+1,因为元素可以重复使用,注意for循环里if(sum(path)<=target)的等号不能少。 class Solution { public: vector<int
阅读全文
摘要:复原IP地址 题目链接:93. 复原 IP 地址 - 力扣(LeetCode) 思路:投降。在判断字符串是否合法这部分遇到了困难。 class Solution { private: vector<string> result;// 记录结果 // startIndex: 搜索的起始位置,point
阅读全文
摘要:491.递增子序列 题目链接:491. 非递减子序列 - 力扣(LeetCode) 思路:一开始一直报访问异常的错误,最后只好参考官网答案,结果竟然是因为我递归参数写错了导致程序一直出问题???(⊙︿⊙) 这里去重用的是标记数组,可以用集合unordered_set,但由于本题数据范围比较小,所以我
阅读全文
摘要:回溯法总结 回溯算法能解决如下问题: 组合问题:N个数里面按一定规则找出k个数的集合 排列问题:N个数按一定规则全排列,有几种排列方式 切割问题:一个字符串按一定规则有几种切割方式 子集问题:一个N个数的集合里有多少符合条件的子集 棋盘问题:N皇后,解数独等等 代码随想录 (programmerca
阅读全文
摘要:理论基础 贪心的本质是选择每一阶段的局部最优,从而达到全局最优。 分发饼干 class Solution { public: int findContentChildren(vector<int>& g, vector<int>& s) { sort(g.begin(), g.end()); sor
阅读全文
摘要:买卖股票的最佳时机II 题目链接:122. 买卖股票的最佳时机 II - 力扣(LeetCode) 思路:本题的贪心法在于用不选择亏钱的买卖,某天能赚钱就一定出手,每天都赚钱从而获得总体的最大利益。具体是计算每一天的利润后,如果大于0,就记入总利益。 class Solution { public:
阅读全文
摘要:K次取反后最大化的数组和 题目链接:1005. K 次取反后最大化的数组和 - 力扣(LeetCode) 思路:首先增序排序,然后依次将负值取反,如果负数先用完,则再排序一次,将最小的正数取反之后求和;如果k先用完,直接求和。 注意sort默认是增序排序,若想要要降序,则不能使用sort(nums.
阅读全文
摘要:柠檬水找零 题目链接:860. 柠檬水找零 - 力扣(LeetCode) 思路:注意对于20元的情况,有两种找零方式, 头一次见到这种情况,随便加一个标准输出才能通过的样例。 class Solution { public: bool lemonadeChange(vector<int>& bill
阅读全文
摘要:无重叠区间 题目链接:435. 无重叠区间 - 力扣(LeetCode) 思路:我的思路是先将所有区间按左端点从小到大排序,左端点相同时右端点从小到大排序。接下来遍历数组,如果下一个区间与该区间有重叠部分,count加1,同时遍历下下一个区间(下一个区间被视为删除),同时如果下一个区间被包含在该区间
阅读全文
摘要:单调递增的数字 题目链接:738. 单调递增的数字 - 力扣(LeetCode) 思路: 从左向右验证是否按位单调递增,如果出现递减的区间,则从该位开始验证该位减1后是否比左边的相邻位大,如果不符合就接着向左寻找这样的位,如果找到了,则将该位前面的位复制到结果中,该位减1加入结果,该位之后的位全部改
阅读全文
摘要:理论基础 代码随想录 (programmercarl.com) 动态规划的五部曲: 确定dp数组(dp table)以及下标的含义 确定递推公式 dp数组如何初始化 确定遍历顺序 举例推导dp数组 斐波那契数 题目链接:509. 斐波那契数 - 力扣(LeetCode) 思路:还好。 class S
阅读全文
摘要:不同路径 题目链接:62. 不同路径 - 力扣(LeetCode) 思路:由于不能回退,因此每一格只能来自上一格或左边一格,因此dp数组中每个格子只要将这两个格子的值相加即可。 class Solution { public: int uniquePaths(int m, int n) { vect
阅读全文
摘要:整数拆分 题目链接:343. 整数拆分 - 力扣(LeetCode) 思路:第一步想的是用递归做, int digui(int n){ if(n==1)return n; return max((n/2)*(n-n/2),digui(n/2)*digui(n-n/2)); } 可惜的是题目并没有规定
阅读全文
摘要:01背包问题,你该了解这些! 题目链接:46. 携带研究材料(第六期模拟笔试) (kamacoder.com) 思路:第一次遇到背包问题,好好记住吧。代码随想录 (programmercarl.com) #include<bits/stdc++.h> using namespace std; int
阅读全文
摘要:最后一块石头的重量 II 题目链接:1049. 最后一块石头的重量 II - 力扣(LeetCode) 思路:尽可能将石头分成重量相近的两堆,结果一定最小,因此问题可以转换为分割子集。dp[i]的含义是背包容量为i的背包能装下的最大重量,由于题目中最大重量是15000,所以我们申请15001的vec
阅读全文
摘要:完全背包 题目链接:52. 携带研究材料(第七期模拟笔试) (kamacoder.com) 思路:完全·背包问题和01背包的区别在于同一个物品可以被重复放入,在代码里的区别就是内部遍历背包的for循环由倒序变成了正序。而且如果我们压缩了一维的话,如我的做法,两个for循环的顺序也是无所谓的。 #in
阅读全文
摘要:爬楼梯 (进阶) 题目链接:57. 爬楼梯(第八期模拟笔试) (kamacoder.com) 思路:笑嘻了,直接给默写出来了。 #include<bits/stdc++.h> using namespace std; int main(){ int n,m; cin>>n>>m; vector<in
阅读全文
摘要:单词拆分 题目链接:139. 单词拆分 - 力扣(LeetCode) 思路:竟然真能转化为背包问题。 class Solution { public: bool wordBreak(string s, vector<string>& wordDict) { unordered_set<string>
阅读全文
摘要:打家劫舍 题目链接:198. 打家劫舍 - 力扣(LeetCode) 思路:每一家的最大收益来源只有两个,一个是这家不偷,那么最大收益等于从上一家出来的最大收益,另一个是偷这一个家,因此最大收益等于从上上一家出来的最大收益加这一家的收益。 class Solution { public: int r
阅读全文
摘要:买卖股票的最佳时机 题目链接:121. 买卖股票的最佳时机 - 力扣(LeetCode) 思路:注意买卖只有一次。 暴力法,因为股票就买卖一次,那么贪心的想法很自然就是取最左最小值,取最右最大值,那么得到的差值就是最大利润: class Solution { public: int maxProfi
阅读全文
摘要:买卖股票的最佳时机III 题目链接:123. 买卖股票的最佳时机 III - 力扣(LeetCode) 思路:与买卖股票2的区别在于我可以买卖两次,那么dp数组的状态就从两种变成了种,即第一次持有,第一次卖出,第二次持有,第二次卖出,注意这四种状态是不会同时存在的,除此之外还有一种状态,那就是不操作
阅读全文
摘要:最佳买卖股票时机含冷冻期 题目链接:309. 买卖股票的最佳时机含冷冻期 - 力扣(LeetCode) 思路:本题难点在于如何将冷冻期加入到状态转移方程中,不妨画个图: 按理来说,如何我们正处于买入状态,将股票卖出后,应该是冷冻状态,但是这里多加了一个今日卖出状态,就是将今日卖出和卖出状态分开看,避
阅读全文
摘要:最长递增子序列 题目链接:300. 最长递增子序列 - 力扣(LeetCode) 思路:感觉有点像暴力? class Solution { public: int lengthOfLIS(vector<int>& nums) { if(nums.size()==1)return 1; vector<
阅读全文
摘要:最长公共子序列 题目链接:1143. 最长公共子序列 - 力扣(LeetCode) 思路:。 class Solution { public: int longestCommonSubsequence(string text1, string text2) { vector<vector<int>>
阅读全文
摘要:判断子序列 题目链接:392. 判断子序列 - 力扣(LeetCode) 思路:从子串s开始遍历,查找t中是否存在,因为全程不需要回溯,因此两个for循环就解决了。只是要注意return的时机。(只要不想写的很简洁,逻辑挺简单的其实) class Solution { public: bool is
阅读全文
摘要:两个字符串的删除操作 题目链接:583. 两个字符串的删除操作 - 力扣(LeetCode) 思路:第一次尝试用画图法,然后肉眼观察dp递归规律……但是dp[i][j]的含义还是参考昨天的思路,表示到此处需要删除多少个字符。 class Solution { public: int minDista
阅读全文
摘要:回文子串 题目链接:647. 回文子串 - 力扣(LeetCode)思路:投降 class Solution { public: int countSubstrings(string s) { vector<vector<bool>> dp(s.size(), vector<bool>(s.size
阅读全文
摘要:每日温度 题目链接:739. 每日温度 - 力扣(LeetCode) 思路:很容易想到暴力解法。但超时也是很轻松的。 class Solution { public: vector<int> dailyTemperatures(vector<int>& temperatures) { // stac
阅读全文
摘要:下一个更大元素II 题目链接:503. 下一个更大元素 II - 力扣(LeetCode) 思路:这里处理循环数组的方式值得学习,用i%nums.size()和for循环的上限来模拟两层for循环。整体思路还是单调栈。 class Solution { public: vector<int> nex
阅读全文
摘要:柱状图中最大的矩形 题目链接:84. 柱状图中最大的矩形 - 力扣(LeetCode) 思路:掌握了……吗?还是参考了下官网思路。代码随想录 (programmercarl.com) class Solution { public: int largestRectangleArea(vector<i
阅读全文
摘要:给你一个正整数 n ,它表示一个 有向无环图 中节点的数目,节点编号为 0 到 n - 1 (包括两者)。 给你一个二维整数数组 edges ,其中 edges[i] = [fromi, toi] 表示图中一条从 fromi 到 toi 的单向边。 请你返回一个数组 answer,其中 answer
阅读全文
摘要:给定二叉树的根节点 root,找出存在于 不同 节点 A 和 B 之间的最大值 V,其中 V = |A.val - B.val|,且 A 是 B 的祖先。 (如果 A 的任何子节点之一为 B,或者 A 的任何子节点是 B 的祖先,那么我们认为 A 是 B 的祖先) 示例 1: 输入:root = [
阅读全文
摘要:给你一棵树,树上有 n 个节点,按从 0 到 n-1 编号。树以父节点数组的形式给出,其中 parent[i] 是节点 i 的父节点。树的根节点是编号为 0 的节点。 树节点的第 k 个祖先节点是从该节点到根节点路径上的第 k 个节点。 实现 TreeAncestor 类: TreeAncestor
阅读全文
浙公网安备 33010602011771号