leetcode
qq_1213701132
这个作者很懒,什么都没留下…
展开
-
131. 分割回文串
方法一:回溯法蓝色框为选择列表,判断截取部分是否为回文串进行枝剪。class Solution {public: vector<vector<string>> res; //保存结果 void backtrack(vector<string>& track,string s,int start){ if(start==s.size()){ //满足条件返回 res.push_back(tr.原创 2020-08-16 10:22:52 · 121 阅读 · 0 评论 -
401. 二进制手表
方法一:回溯法相当于组合类的回溯class Solution {public: map<int,int> mp{{0,1},{1,2},{2,4},{3,8},{4,1},{5,2},{6,4},{7,8},{8,16},{9,32}}; vector<string> res; //保存结果 void backtrack(pair<int,int>& time,int num,int start){ if(num=.原创 2020-08-16 09:25:45 · 169 阅读 · 0 评论 -
994. 腐烂的橘子
解法:bfsclass Solution {public: int orangesRotting(vector<vector<int>>& grid) { if(grid.empty()) return 0; int rows=grid.size(),cols=grid[0].size(); queue<pair<int,int>> q; bool flag=false; .原创 2020-08-15 11:16:08 · 148 阅读 · 0 评论 -
1162. 地图分析
解法:bfsclass Solution {public: int maxDistance(vector<vector<int>>& grid) { if (grid.empty()) return 0; int rows = grid.size(),cols = grid[0].size(); vector<vector<int>> dist(rows, vector<int>(cols)); /..原创 2020-08-14 21:38:02 · 166 阅读 · 0 评论 -
901. 股票价格跨度
方法:单调栈class StockSpanner {public: stack<int> st; vector<int> prices; vector<int> res; StockSpanner() { } int next(int price) { prices.push_back(price); int ret = prices.size() - 1; .原创 2020-08-14 10:15:01 · 126 阅读 · 0 评论 -
496. 下一个更大元素 I
方法一:单调栈class Solution {public: vector<int> nextGreaterElement(vector<int>& nums1, vector<int>& nums2) { vector<int> res; stack<int> st; map<int,int> mp; for(int i=nums2.size.原创 2020-08-13 21:59:21 · 121 阅读 · 0 评论 -
343. 整数拆分
解法:动态规划dp[i]为分解后的最大值,对于每个值n,dp[n]为1dp[n-1],2dp[n-2]…(n-1)dp[1]的最大值,只用计算一半。同时,在每次分解时 4dp[n-4],还要与不分解是的情况4*(n-4)比较大小。class Solution {public: int integerBreak(int n) { int res=0; vector<int> dp(n+1); dp[1]=dp[2]=1; .原创 2020-08-09 09:19:44 · 110 阅读 · 0 评论 -
338. 比特位计数
解法:动态规划奇数的二进制表示一定比前面偶数多一个 1,多的就是最低位的 1;偶数的二进制表示中 1 的个数一定和除以 2 之后的那个数一样多,因为最低位是 0。class Solution {public: vector<int> countBits(int num) { vector<int> dp(num+1); for(int i=1;i<=num;i++){ if(1 & i) //.原创 2020-08-09 09:12:29 · 112 阅读 · 0 评论 -
714. 买卖股票的最佳时机含手续费
解法:动态规划class Solution {public: int maxProfit(vector<int>& prices, int fee) { if(prices.size()<2) return 0; int n=prices.size(); //状态:dp[n][t]表示第n天,t=1表示持有股票或t=0表示不持有股票时的最大收益 int dp[n][2]={0}; //初.原创 2020-08-09 09:08:20 · 187 阅读 · 0 评论 -
1139. 最大的以 1 为边界的正方形
解法:动态规划使用3维数组dp[m + 1][n + 1][2]dp[i][j][0]:表示第i行第j列的1往 左边 最长连续的1的个数dp[i][j][1]:表示第i行第j列的1往 上面 最长连续的1的个数dp数组比grid数组上左两边多一层。class Solution {public: int largest1BorderedSquare(vector<vector<int>>& grid) { if(grid.empty()) .原创 2020-08-09 09:07:48 · 93 阅读 · 0 评论 -
312. 戳气球
解法:动态规划class Solution {public: int maxCoins(vector<int>& nums) { int n=nums.size(); vector<int> points(n+2,0); //添加虚拟气球 points[0]=points[n+1]=1; for(int i=0;i<n;i++) points[i.原创 2020-08-09 09:07:00 · 104 阅读 · 0 评论 -
303. 区域和检索 - 数组不可变
方法:动态规划class NumArray {private: int* dp;public: NumArray(vector<int>& nums) { dp=new int[nums.size()+1]; for(int i=0;i<nums.size();i++){ dp[i+1]=dp[i]+nums[i]; } } int sumRange(int i.原创 2020-08-09 09:10:15 · 122 阅读 · 0 评论 -
304. 二维区域和检索 - 矩阵不可变
解法:动态规划class NumMatrix {private: vector<vector<int>> dp; //dp数组比matrix多一圈为0public: NumMatrix(vector<vector<int>>& matrix) { if(matrix.empty() || matrix[0].empty()) return; dp=vector<vector<int&.原创 2020-08-07 09:24:48 · 97 阅读 · 0 评论 -
139. 单词拆分
解法:动态规划class Solution {public: bool wordBreak(string s, vector<string>& wordDict) { vector<bool> dp(s.size()+1,false); //初始值 dp[0]=true; //转移方程:以i为起点的字符串能否与字典里的字符串匹配 for(int i=0;i<s.size();i.原创 2020-08-07 09:24:17 · 128 阅读 · 0 评论 -
213. 打家劫舍 II
解法:动态规划class Solution {public: int rob(vector<int>& nums) { if(nums.empty()) return 0; if(nums.size()==1) return nums[0]; int n=nums.size(); int dp[n]={0}; if(n==2) return max(num.原创 2020-08-07 09:23:42 · 109 阅读 · 0 评论 -
198. 打家劫舍
解法:动态规划class Solution {public: int rob(vector<int>& nums) { if(nums.empty()) return 0; if(nums.size()==1) return nums[0]; int n=nums.size(); vector<int> dp(n,0); dp[0]=nums[0]; dp[1.原创 2020-08-07 09:23:04 · 128 阅读 · 0 评论 -
322. 零钱兑换
解法:动态规划class Solution {public: int coinChange(vector<int>& coins, int amount) { vector<int> dp(amount+1,amount+1); //初始化dp,值为较大的数 //初始化 dp[0]=0; //转移方程 for(int i=1;i<=amount;i++){ .原创 2020-08-07 09:22:31 · 174 阅读 · 1 评论 -
300. 最长上升子序列
解法:动态规划class Solution {public: int lengthOfLIS(vector<int>& nums) { //初始化 vector<int> dp(nums.size(),1); //状态:以i为结尾的子序列长度 for(int i=0;i<nums.size();i++){ for(int j=0;j<i;j++){ //寻找i.原创 2020-08-07 09:21:53 · 119 阅读 · 0 评论 -
746. 使用最小花费爬楼梯
解法:动态规划class Solution {public: int minCostClimbingStairs(vector<int>& cost) { if(cost.empty() || cost.size()==1) return 0; if(cost.size()==2) return min(cost[0],cost[1]); int n=cost.size(); for(int i=2;i.原创 2020-08-07 09:21:15 · 127 阅读 · 0 评论 -
309. 最佳买卖股票时机含冷冻期
解法:动态规划class Solution {public: int maxProfit(vector<int>& prices) { if(prices.size()<2) return 0; int n=prices.size(); //状态:dp[n][t]表示第n天,t=1表示持有股票或t=0表示不持有股票时的最大收益 int dp[n+1][2]={0}; //初始化 .原创 2020-08-07 09:20:33 · 107 阅读 · 0 评论 -
188. 买卖股票的最佳时机 IV
解法:动态规划class Solution {public: int maxProfit(int k, vector<int>& prices) { if(prices.size()<2 || k<1) return 0; int n=prices.size(); //无限次情况 if (k >= n/2) { int res = 0; for.原创 2020-08-07 09:19:44 · 99 阅读 · 0 评论 -
123. 买卖股票的最佳时机 III
解法:动态规划class Solution {public: int maxProfit(vector<int>& prices) { if(prices.empty()) return 0; int n=prices.size(); //状态:dp[n][k][b]表示第n天,已经交易k次,若b=1表示持有股票,b=0表示不持有股票 long dp[n][3][2]={0}; //初始化,I.原创 2020-08-07 09:18:55 · 109 阅读 · 0 评论 -
120. 三角形最小路径和
解法:动态规划class Solution {public: int minimumTotal(vector<vector<int>>& triangle) { for(int i=triangle.size()-2;i>=0;i--){ for(int j=0;j<=i;j++){ triangle[i][j]+=min(triangle[i+1][j],triangle[i+.原创 2020-08-06 11:28:20 · 101 阅读 · 0 评论 -
174. 地下城游戏
解法:动态规划class Solution {public: //自下而上的动态规划 int calculateMinimumHP(vector<vector<int>>& dungeon) { int m=dungeon[0].size(); int n=dungeon.size(); if(m==0 || n==0) return 0; //状态:dp[n][m]表示从n,m开始出发的最.原创 2020-08-06 11:23:08 · 105 阅读 · 0 评论 -
115. 不同的子序列
解法:动态规划注意:用unsigned,int会溢出。class Solution {public: int numDistinct(string s, string t) { int m=t.size(),n=s.size(); //状态:字符串T中以i结尾的子字符串 在 字符串S中以j结尾的子字符串中出现的次数 unsigned dp[m+1][n+1]={0}; //初始化 for(int i=0;i<.原创 2020-08-06 10:56:10 · 115 阅读 · 0 评论 -
70. 爬楼梯
解法:动态规划不难发现,这个问题可以被分解为一些包含最优子结构的子问题,即它的最优解可以从其子问题的最优解来有效地构建,我们可以使用动态规划来解决这一问题。第 i 阶可以由以下两种方法得到:在第(i−1)阶后向上爬1阶。在第(i-2)阶后向上爬 2 阶。所以到达第 i 阶的方法总数就是到第(i−1)阶和第 (i−2) 阶的方法数之和。令dp[i]表示能到达第i阶的方法总数:dp[i]=dp[i-1]+dp[i-2]class Solution {public: int climbS.原创 2020-08-06 10:52:03 · 104 阅读 · 0 评论 -
63. 不同路径 II
解法:动态规划class Solution {public: int uniquePathsWithObstacles(vector<vector<int>>& obstacleGrid) { int m=obstacleGrid.size(); int n=obstacleGrid[0].size(); if(obstacleGrid[0][0]==1) return 0; //起始点为障碍 .原创 2020-08-06 10:36:36 · 114 阅读 · 0 评论 -
45. 跳跃游戏 II
解法:贪心算法[i,end]为所有可选择的跳跃步数,farthest为在[i,end]中能够跳到的最远距离jmp为跳跃的次数class Solution {public: int jump(vector<int>& nums) { int end=0, farthest=0; int jmp=0; for(int i=0;i<nums.size()-1;i++){ farthest=max.原创 2020-08-06 10:06:05 · 75 阅读 · 0 评论 -
40. 组合总和 II
解法:回溯算法class Solution {public: vector<vector<int>> res; //返回值 void backtrack(vector<int>& track,vector<int>& candidates,int target,int beg){ //满足条件返回 if(target==0){ if(find(res.begin.原创 2020-08-06 10:00:33 · 106 阅读 · 0 评论 -
986. 区间列表的交集
解法:双指针class Solution {public: vector<vector<int>> intervalIntersection(vector<vector<int>>& A, vector<vector<int>>& B){ vector<vector<int>> res; int i=0,j=0; while(i<.原创 2020-08-05 19:27:39 · 91 阅读 · 0 评论 -
452. 用最少数量的箭引爆气球
解法:贪心算法class Solution {public: static bool cmp(vector<int>x ,vector<int>y){ return x[1] < y[1]; } int findMinArrowShots(vector<vector<int>>& points) { if(points.empty()) return 0; sort.原创 2020-08-05 17:19:32 · 104 阅读 · 0 评论 -
435. 无重叠区间
解法:贪心算法class Solution {public: static bool cmp(vector<int>x, vector<int>y){ //静态成员函数 return x[1] < y[1]; } int eraseOverlapIntervals(vector<vector<int>>& intervals) { if(intervals.empty(.原创 2020-08-05 16:55:35 · 89 阅读 · 0 评论 -
77. 组合
解法:回溯算法class Solution { void backtrack(vector<vector<int>>& res,vector<int>& track,int n,int k,int level){ if(track.size()==k){ res.push_back(track); return ; } for(int i=level.原创 2020-08-05 15:31:37 · 114 阅读 · 0 评论 -
47. 全排列 II
解法:回溯算法class Solution {private: void backtrack(vector<vector<int>>& res,vector<int>& nums,int level){ if(nums.size()==level){ //满足结束条件 res.push_back(nums); return; } set<i.原创 2020-08-05 15:12:27 · 86 阅读 · 0 评论 -
90. 子集 II
解法:回溯算法class Solution { void backtrack(vector<vector<int>>& res,vector<int>& nums,vector<int> track,int beg){ sort(track.begin(),track.end()); //排序 if(find(res.begin(),res.end(),track)==res.end()) .原创 2020-08-05 14:45:20 · 109 阅读 · 0 评论 -
37. 解数独
解法:回溯算法class Solution {bool backtrack(vector<vector<char>>& board, int i, int j) { int m = 9, n = 9; if (j == n) // 穷举到最后一列的话就换到下一行重新开始。 return backtrack(board, i + 1, 0); if (i == m) // 找到一个可行解,触发 base ca.原创 2020-08-05 11:16:41 · 167 阅读 · 0 评论 -
51. N皇后
解法:回溯算法class Solution { // 路径:board 中小于 row 的那些行都已经成功放置了皇后 // 选择列表:第 row 行的所有列都是放置皇后的选择 // 结束条件:row 超过 board 的最后一行 void backtrack(vector<vector<string>>& res,vector<string>& board, int row) { if (row == b.原创 2020-08-05 10:59:35 · 129 阅读 · 0 评论 -
46. 全排列
解法:回溯算法class Solution {private: void backtrack(vector<vector<int>>& res,vector<int>& track,vector<int>& nums){ if(nums.size()==track.size()){ //满足结束条件 res.push_back(track); return;.原创 2020-08-05 10:46:27 · 126 阅读 · 0 评论 -
100. 相同的树
方法一:递归/** * Definition for a binary tree node. * struct TreeNode { * int val; * TreeNode *left; * TreeNode *right; * TreeNode(int x) : val(x), left(NULL), right(NULL) {} * }; */class Solution {public: bool isSameTree(TreeNo..原创 2020-07-13 19:59:32 · 96 阅读 · 0 评论 -
367. 有效的完全平方数
方法一:迭代法class Solution {public: bool isPerfectSquare(int num) { if(num==1 || num==0) return true; long i=1; while(i*i<num) i++; return ...原创 2020-04-02 10:56:01 · 116 阅读 · 0 评论