![](https://img-blog.csdnimg.cn/20190927151124774.png?x-oss-process=image/resize,m_fixed,h_224,w_224)
刷题笔记
个人的刷题笔记
小名王能全
多思考
展开
-
LeetCode. 基本数据结构
LeetCode 基本数据结构一些题原创 2022-07-26 18:51:34 · 397 阅读 · 0 评论 -
滑动窗口、双指针、单调队列、单调栈
滑动窗口、双指针、单调队列、单调栈一些题原创 2022-07-26 08:58:13 · 131 阅读 · 0 评论 -
LeetCode字符串
C++ 字符串的一些题原创 2022-07-13 19:10:46 · 133 阅读 · 0 评论 -
LeetCode树
LeetCode树一些题原创 2022-07-11 11:18:58 · 100 阅读 · 0 评论 -
ACWing每日一题.3511
刷题笔记原创 2022-07-04 16:16:09 · 186 阅读 · 0 评论 -
组合问题呢
组合问题全排列全排列Ⅰ数组内不含重复数字// 回溯class Solution { vector<vector<int>> ans;public: void backtracking(vector<int>& nums,int label) { // 确定终止条件 if(label == nums.size()) { ans.push_back(nums原创 2022-04-11 16:46:59 · 224 阅读 · 0 评论 -
剑指offer 56 - Ⅱ.数组中数字出现的次数Ⅱ
剑指offer 56 - Ⅱ.数组中数字出现的次数Ⅱ问题:一个数组,其中只有一个数出现过1次,其他数都出现了3次,找出这个只出现一次的数字。思路:出现过3次的数的和一定能整除以3不留余数遍历每一个数,数的每一bit对应加入长度为32的数组的各个位置;数组各个位置保存的数对3取余就是ans相应bit的值,ans不断左移,每次取余后的数放入ans的最后位置;return ans;class Solution {public: int singleNumber(vector<int原创 2022-04-11 09:50:20 · 243 阅读 · 0 评论 -
LeetCode 347. 前K个高频元素
LeetCode 347. 前K个高频元素输入一个整数数组和一个整数k,返回其中出现频率前k高的元素。保证答案唯一,不会出现返回元素的个数大于k的情况,可以按任意顺序返回答案。思路:建立哈希表统计每个元素出现的次数建立容量为10001的vector表示:出现次数i-出现次数都为i的全部元素[元素1,元素2…];vector<vector<int>> topK(10001,vector<int>{});topK[i.second].push_back(原创 2022-04-08 11:30:11 · 151 阅读 · 0 评论 -
优先队列啊
priority_queuepriority_queue<Type, Container, Functional>// type:数据类型// container:容器类型// functional:比较的方式 默认是大顶堆,具体实现// 升序队列,小顶堆priority_queue<int,vector<int>,greater<int>> q;// 降序队列,大顶堆priority_queue<int,vector<int原创 2022-04-01 21:54:19 · 172 阅读 · 0 评论 -
背包问题嗯
背包问题“0-1背包”二维数组:// 递推公式二维:dp[i][j] = max(dp[i - 1][j], dp[i - 1][j - weight[i]] + value[i]); 一维:dp[j] = max(dp[j], dp[j - nums[i]] + weight[i]);dp[i] [j] :从下标[0-i]的物品里任意取,放进容量为j的背包,价值总和最大为多少。dp数组内容变化:01515151501515max(15,0+20)=20原创 2022-03-25 10:09:52 · 606 阅读 · 0 评论 -
LeetCode 1143.最长公共子序列
LeetCode 1143.最长公共子序列动态规划确定dp数组及其下标的含义dp[i] [j]:长度为**[0,i-1]的字符串text1与长度为[0,j-1]**的字符串text2的最长公共子序列为dp[i] [j]确定递推公式分两种情况:text1[i-1]与text2[j-1]相同;即找到一个公共元素,dp[i] [j] = dp[i-1] [j-1] + 1;text1[i-1]与text2[j-1]不同;找max(text1[0,i-2]与text2[0,j-1]和text原创 2022-03-24 10:59:29 · 1422 阅读 · 0 评论 -
LeetCode 300.最长递增子序列
LeetCode 300.最长递增子序列动态规划dp数组的定义:以第i个元素为结尾的递增子序列的长度ways: 遍历nums各个元素,当便利到第i个元素时,依次与它前面的元素一一比较,如果nums[i] > nums[j] ,则此时dp[i] = max(dp[i],dp[j]+1]) 最后return 最大的dp[i]完整代码:class Solution {public: int lengthOfLIS(vector<int>& nums)原创 2022-03-23 16:43:09 · 1114 阅读 · 0 评论 -
LeetCode 33.搜索旋转排序数组
LeetCode 33.搜索旋转排序数组二分法将数组一分为二,其中一定有一个是有序的,另一个可能是有序,也能是部分有序。此时有序部分用二分法查找。无序部分再一分为二,其中一个一定有序,另一个可能有序,可能无序。就这样循环.eg:nums=[4,5,6,7,0,1,2],target = 04567012leftl0l1,2rightr2r0,r1midm0m2m1完整代码:class Solutio原创 2022-03-23 16:00:39 · 829 阅读 · 0 评论 -
LeetCode 343.整数拆分
LeetCode 343.整数拆分111111111112345678910112469121827363 x 3 > 2 x 2 x 210 = 3 + 7 (7 > 3)7 = 3 + 4 (7 > 3)4 = 3+1 || 2+2 (1 < 3)/3 余大于3 : 继续除以3/3 余小于3 : 余0 : 最后是3, 余1 : 最后是4,4时4最大原创 2022-03-23 14:12:45 · 540 阅读 · 0 评论 -
LeetCode 139.单词拆分
LeetCode 139.单词拆分ways:dp[n]的定义: 从s[0]到s[n]是否可以利用字典中出现的单词拼接出来dp初始化: dp要比s多一个,并且dp[0] = true步骤:遍历s: if(s[i] == wordDict[j] [0]) : i和j[0]向下遍历,if(s的一部分和wordDict[j]都相等并且dp[s之前之前结束的位置]==true) , 则dp[s现在结束的位置] = true; else 继续遍历return dp[s.size(原创 2022-03-23 10:42:16 · 309 阅读 · 0 评论 -
LeetCode 279.完全平方数
LeetCode 279.完全平方数ways:动态规划dp[i] : 代表i最少由几个完全平方数组成初始化:dp[0] : 0dp[i] : i // 最差情况是由i个1组成递推公式:dp[i] = min(dp[i],dp[i-j*j]+1) // ‘‘寻找距离i最近的完全平方数‘’完整代码:class Solution {public: int numSquares(int n) { vector<int> dp(n+1,0);原创 2022-03-22 11:06:21 · 498 阅读 · 0 评论 -
LeetCode 91.解码方法
LeetCode 91.解码方法ways:s[i] = 0 : if(s[i-1] == 1 || s[i-1] == 2) :s[i]只能和前一位绑定在一起,此时dp[i] = dp[i-2]; else return 0 :无意义s[i] != 0: if(s[i-1] ==1 ) : s[i]能和s[i-1]组合也能拆开,dp[i] = dp[i-1]+dp[i-2]; else if(s[i-1] == 2 && s[i原创 2022-03-22 10:17:18 · 656 阅读 · 0 评论 -
LeetCode 221.最大正方形
LeetCode 221.最大正方形ways:构建一个二维res(m+1,n+1)数组,数组多构建1行1列,res[i+1] [j+1]代表在matrix中以matrix[i] [j]为右下角的最大正方形的边长完整代码:class Solution {public: int maximalSquare(vector<vector<char>>& matrix) { int m = matrix.size(),n = matrix[0].s原创 2022-03-21 16:50:12 · 300 阅读 · 0 评论 -
LeetCode 542.01矩阵
LeetCode 542.01矩阵ways:第一轮从左上到右下遍历第二轮从右下到左上遍历证明: 先明白一个定理: 如果距离(i,j)最近的点为(i-a,j+b),那么距离(i,j+b)最近的点也是(i-a,j+b) 所以:如果第一遍(i,j)没有传到(i-a,j+b),但是(i-a,j+b)第一遍传到了(i,j+b),在第二遍的时候,(i,j+b)会传到(i,j) 所以,结论成立。完整代码:class Solution {public: vector<vect原创 2022-03-21 16:16:30 · 278 阅读 · 0 评论 -
LeetCode 64.最小路径和
LeetCode 64.最小路径和thought:从左上角向右下角遍历一次初始化 第一行是grid[0]从左向右递加 第一列是grid[i] [0]从上向下递加从左上向右下: 从grid[1] [1]开始,grid[i] [j] = min(上,左,)遍历完i=1行再遍历i=2行,直至遍历完所有行,return所有代码:class Solution {public: int minPathSum(vector<vector<int>>&原创 2022-03-21 15:00:14 · 262 阅读 · 0 评论 -
LeetCode 413.等差数列划分
LeetCode 413.等差数列划分动态规划if(num[i] - nums[i-1] == nums[i-1] - nums[i-2]) // 说明此三个数是等差数组dp数组:dp[i] : 第i个元素的标志位最后 return accumulate(dp.begin() , dp.end() , 0);label:标志位,对应着第i个元素连续等差数列的长度:1-3;2-4;… 如果加入第i个元素后,上组等差数列仍然是等差数列,则label++;原创 2022-03-21 13:04:46 · 285 阅读 · 0 评论 -
LeetCode 198.打家劫舍
LeetCode 198.打家劫舍动态规划面对一间房屋,选择偷 -> 下一间房屋不能偷不偷 -> 下一间房屋可以偷确定dp数组dp[j][i] : i间房屋可以偷窃到的最高金额j的定义:j = 0 : 不偷j = 1 : 偷dp函数:dp[0][i] = max(dp[1][i-1],dp[0][i-1])dp[1][i] = dp[0][i-1] + nums[i]初始化dp数组:dp[0][0] = 0dp[0][1] = nums[1]下原创 2022-03-21 11:31:43 · 311 阅读 · 0 评论 -
LeetCode 241.为运算表达式设置优先级
LeetCode 241.为运算表达式设置优先级运算符:+ - *class Solution {public: vector<int> diffWaysToCompute(string expression) { vector<int> ways; for(int i=0;i<expression.size();i++) { char c = expression[i]; if(c == '原创 2022-03-18 10:36:35 · 254 阅读 · 0 评论 -
LeetCode 122. 买卖股票的最佳时机 II&III
LeetCode 122. 买卖股票的最佳时机 II确定dp数组:dp[i][j] : 第i天所剩余的金钱为dp[i][j]j : 2种状态:j = 0 : 买入j = 1 : 卖出确定dp转移方程:可以达到dp[i][0]的操作: 前一天是买入 : dp[i][0] = dp[i-1][0] 前一天是卖出 : dp[i][0] = dp[i-1][1] - prices[i] 可以达到dp[i][1]的操作: 前一天是买入 : dp[i][1] = dp[i-1原创 2022-03-17 10:42:00 · 250 阅读 · 0 评论 -
LeetCode 309.最佳买卖股票时机含冷冻期
LeetCode 309.最佳买卖股票时机含冷冻期确定dp数组dp[i][j]:第i天状态为j,所剩的最多现金为dp[i][j]四个状态状态1:买入股票状态(今天买入股票,或是之前就买入股票但是没有操作);j=0卖出股票状态状态2:两天前卖出股票,已经度过冷冻期,一直没操作,今天保持卖出股票状态;j=1状态3:今天卖出股票;j=2状态4:今天为冷冻期,且只有今天;j=3(三个状态)错误!!!- 状态1:买入股票状态;j=0- 状态2:卖出股票状态;j=1- 状态3:冷冻原创 2022-03-16 19:53:58 · 676 阅读 · 0 评论 -
LeetCode .188 买卖股票的最佳时机Ⅳ
LeetCode .188 买卖股票的最佳时机Ⅳdp[i][j] : 第i天的状态为j,所剩下的最大现金是dp[i][j]j的状态表示为: 0 表示不操作 1 第一次买入 // dp[i][1],表示的是第i天,买入股票的状态,并不是说一定要第i天买入股票; 2 第一次卖出 // 偶数表示卖出 3 第二次买入 4 第二次卖出 // 偶数表示卖出二维数组:// 二维数组的定义vector<vector<int>> dp(prices.size(),vec原创 2022-03-16 15:47:33 · 976 阅读 · 0 评论 -
LeetCode .72
LeetCode 72.编辑距离给你两个单词 word1 和 word2, 请返回将 word1 转换成 word2 所使用的最少操作数 。你可以对一个单词进行如下三种操作:插入一个字符删除一个字符替换一个字符dp数组定义:dp[i][j] : 以下标i-1为结尾的字符串word1和以下标j-1为结尾的字符串word2,最少操作数为dp[i][j]确定递推公式:// 递归公式if (word1[i - 1] == word2[j - 1]) 不操作if (word1[i -原创 2022-03-15 17:15:22 · 344 阅读 · 0 评论 -
LeetCode 70.爬楼梯
LeetCode 70.爬楼梯假设你正在爬楼梯。需要 n 阶你才能到达楼顶。每次你可以爬 1 或 2 个台阶。你有多少种不同的方法可以爬到楼顶呢?// 动态规划// 斐波那契额数列// 第i阶可以从第i-1阶和第i-2阶到达 -> 状态转移方程:dp[i] = dp[i-1] + dp[i-2]#include<iostream>#include<vector>using namespace std;class Solution {public: int原创 2022-03-13 19:34:38 · 196 阅读 · 0 评论 -
LeetCode 34.在排序数组中查找元素的第一个和最后一个位置
LeetCode 34.在排序数组中查找元素的第一个和最后一个位置给定一个按照升序排列的整数数组 nums,和一个目标值 target。找出给定目标值在数组中的开始位置和结束位置。如果数组中不存在目标值 target,返回 [-1, -1]。class Solution {public: vector<int> searchRange(vector<int>& nums, int target) { int leftBorder = getLe原创 2022-03-13 19:06:12 · 157 阅读 · 0 评论 -
LeetCode 934.最短的桥
LeetCode 934.最短的桥在给定的二维二进制数组 A 中,存在两座岛。(岛是由四面相连的 1 形成的一个最大组。)现在,我们可以将 0 变为 1,以使两座岛连接起来,变成一座岛。返回必须翻转的 0 的最小数目。(可以保证答案至少是 1 。)// 广度优先搜索 - 通过先入先出的队列实现class Solution {public: vector<int> direction{-1,0,1,0,-1}; int shortestBridge(vector<原创 2022-03-13 17:08:58 · 585 阅读 · 0 评论 -
LeetCode 51.N皇后
LeetCode 51.N皇后n 皇后问题 研究的是如何将 n 个皇后放置在 n×n 的棋盘上,并且使皇后彼此之间不能相互攻击(使其中任意两个皇后都不同列、同行和在一条斜线上 )。给你一个整数 n ,返回所有不同的 n 皇后问题 的解决方案。每一种解法包含一个不同的 n 皇后问题 的棋子放置方案,该方案中 ‘Q’ 和 ‘.’ 分别代表了皇后和空位。class Solution {public: vector<vector<string>> solveNQueens(原创 2022-03-13 16:45:00 · 428 阅读 · 0 评论 -
LeetCode 79.单词搜索
LeetCode 79.单词搜索给定一个 m x n 二维字符网格 board 和一个字符串单词 word 。如果 word 存在于网格中,返回 true ;否则,返回 false 。单词必须按照字母顺序,通过相邻的单元格内的字母构成,其中“相邻”单元格是那些水平相邻或垂直相邻的单元格。同一个单元格内的字母不允许被重复使用。// 有“往回走”的情况就考虑回溯class Solution {public: bool exist(vector<vector<char>>原创 2022-03-12 15:40:28 · 256 阅读 · 0 评论 -
LeetCode 46.组合
LeetCode 46.组合给定一个不含重复数字的数组 nums ,返回其 所有可能的全排列 。你可以 按任意顺序 返回答案。// 树的问题,用回溯class Solution {public: vector<vector<int>> combine(int n, int k) { backtracking(n,k,1); return res; }private: vector<vector<int>原创 2022-03-12 15:18:53 · 119 阅读 · 0 评论 -
LeetCode 46.全排列
LeetCode 46.全排列给定一个不含重复数字的数组 nums ,返回其 所有可能的全排列 。你可以 按任意顺序 返回答案。// 想象成树,树的问题考虑是否可以回溯;class Solution {public: vector<vector<int>> permute(vector<int>& nums) { int n = nums.size(); vector<vector<int>>原创 2022-03-11 21:48:20 · 207 阅读 · 0 评论 -
LeetCode 417.太平洋大西洋水流问题
LeetCode 417.太平洋大西洋水流问题有一个 m × n 的长方形岛屿,与 太平洋 和 大西洋 相邻。 “太平洋” 处于大陆的左边界和上边界,而 “大西洋” 处于大陆的右边界和下边界。这个岛被分割成一个个方格网格。给定一个 m x n 的整数矩阵 heights , heights[r][c] 表示坐标 (r, c) 上单元格 高于海平面的高度 。岛上雨水较多,如果相邻小区的高度 小于或等于 当前小区的高度,雨水可以直接向北、南、东、西流向相邻小区。水可以从海洋附近的任何细胞流入海洋。返回原创 2022-03-11 20:47:21 · 274 阅读 · 0 评论 -
LeetCode 547.省份数量
LeetCode 547.省份数量有 n 个城市,其中一些彼此相连,另一些没有相连。如果城市 a 与城市 b 直接相连,且城市 b 与城市 c 直接相连,那么城市 a 与城市 c 间接相连。省份 是一组直接或间接相连的城市,组内不含其他没有相连的城市。给你一个 n x n 的矩阵 isConnected ,其中 isConnected[i][j] = 1 表示第 i 个城市和第 j 个城市直接相连,而 isConnected[i][j] = 0 表示二者不直接相连。返回矩阵中 省份 的数量。cla原创 2022-03-11 20:07:31 · 124 阅读 · 0 评论 -
LeetCode 547.省份数量
LeetCode 547.省份数量有 n 个城市,其中一些彼此相连,另一些没有相连。如果城市 a 与城市 b 直接相连,且城市 b 与城市 c 直接相连,那么城市 a 与城市 c 间接相连。省份 是一组直接或间接相连的城市,组内不含其他没有相连的城市。给你一个 n x n 的矩阵 isConnected ,其中 isConnected[i][j] = 1 表示第 i 个城市和第 j 个城市直接相连,而 isConnected[i][j] = 0 表示二者不直接相连。返回矩阵中 省份 的数量。[外链原创 2022-03-11 20:05:30 · 223 阅读 · 0 评论 -
LeetCode 695.岛屿的最大面积
LeetCode 695.岛屿的最大面积给你一个大小为 m x n 的二进制矩阵 grid 。岛屿 是由一些相邻的 1 (代表土地) 构成的组合,这里的「相邻」要求两个 1 必须在 水平或者竖直的四个方向上 相邻。你可以假设 grid 的四个边缘都被 0(代表水)包围着。岛屿的面积是岛上值为 1 的单元格的数目。计算并返回 grid 中最大的岛屿面积。如果没有岛屿,则返回面积为 0 。输出:6// dfs深度遍历class Solution {public: int maxArea原创 2022-03-11 19:40:17 · 226 阅读 · 0 评论 -
LeetCode 215.数组中的第K个最大元素
LeetCode 215.数组中的第K个最大元素给定整数数组 nums 和整数 k,请返回数组中第 **k** 个最大的元素。请注意,你需要找的是数组排序后的第 k 个最大的元素,而不是第 k 个不同的元素。class Solution {public: int findKthLargest(vector<int>& nums, int k) { int left = 0,right = nums.size()-1,target = nums.size()原创 2022-03-10 20:41:15 · 202 阅读 · 0 评论 -
LeetCode 81.搜索旋转排序数组Ⅱ
LeetCode 81.搜索旋转排序数组Ⅱ已知存在一个按非降序排列的整数数组 nums ,数组中的值不必互不相同。在传递给函数之前,nums 在预先未知的某个下标 k(0 <= k < nums.length)上进行了 旋转 ,使数组变为 [nums[k], nums[k+1], …, nums[n-1], nums[0], nums[1], …, nums[k-1]](下标 从 0 开始 计数)。例如, [0,1,2,4,4,4,5,6,6,7] 在下标 5 处经旋转后可能变为 [4,5,原创 2022-03-10 20:05:09 · 65 阅读 · 0 评论