
leetcode/剑指offer
刷题,算法
peachzy
冲冲冲~
展开
-
LeetCode 210. 课程表 II(拓扑排序)
LeetCode 课程表 拓扑排序 深度优先搜索(dfs)原创 2022-08-20 20:32:17 · 493 阅读 · 1 评论 -
动态规划经典状态分解
动态规划原创 2022-06-13 18:24:48 · 417 阅读 · 0 评论 -
并查集详解与例题
超容易理解超详细的并查集详解(一个大佬写的超详细):并查集详解LeetCode 547 省份数量class Solution { public: vector<int> father; int find(int x) { // 查父节点 int root = x; while (father[root] != -1) { root = fat原创 2022-05-28 09:06:45 · 397 阅读 · 0 评论 -
和为某一个值的数组或者路径
1、牛客网 NC46 加起来和为目标值的组合class Solution {public: void dfs(vector<vector<int>>&res,vector<int>&path,vector<int>&num,int cur,int target){ if(target==0){ res.push_back(path); return;原创 2021-08-30 14:40:58 · 194 阅读 · 0 评论 -
leetcode dfs剪枝以及bfs
一、字符串的排列题目描述:输入一个字符串,打印出该字符串中字符的所有排列。你可以以任意顺序返回这个字符串数组,但里面不能有重复元素。代码如下:class Solution {public: vector<string> permutation(string s) { vector<string>res; string str; vector<int>visited(s.size(),0);原创 2021-06-23 09:10:12 · 224 阅读 · 0 评论 -
两个有序数组的第K个元素
题目:给定两个有序数组nums1,nums2,输出这两个数组排序后的第K个元素思路:参考评论1、使用两个变量i和j分别来标记数组nums1和nums2的起始位置。2、然后来处理一些边界问题,比如当某一个数组的起始位置大于等于其数组长度时,说明其所有数字均已经被淘汰了,相当于一个空数组了,那么实际上就变成了在另一个数组中找数字,直接就可以找出来了。3、如果K=1的话,那么我们只要比较nums1和nums2的起始位置i和j上的数字就可以了。4、难点就在于一般的情况怎么处理?因为我们需要在两个有序数组中原创 2021-06-21 09:42:20 · 1150 阅读 · 0 评论 -
leetcode 1049 最后一块石头的重量II(01背包)
题目描述:有一堆石头,用整数数组 stones 表示。其中 stones[i] 表示第 i 块石头的重量。每一回合,从中选出任意两块石头,然后将它们一起粉碎。假设石头的重量分别为 x 和 y,且 x <= y。那么粉碎的可能结果如下:如果 x == y,那么两块石头都会被完全粉碎;如果 x != y,那么重量为 x 的石头将会完全粉碎,而重量为 y 的石头新重量为 y-x。最后,最多只会剩下一块 石头。返回此石头 最小的可能重量 。如果没有石头剩下,就返回 0。思路:1、根据题意:如果两原创 2021-06-08 09:56:25 · 207 阅读 · 0 评论 -
剑指offer JZ48 不用加减乘除做加法
题目描述:写一个函数,求两个整数之和,要求在函数体内不得使用+、-、*、/四则运算符号。思路:不能用四则运算的话,只能用位运算,一位一位的计算比如5+7=1243211:0001 1:00010:0000 1:00010001 0000首先对于没有进位的位来说,只要异或就行但是对于有进位的来说,异或之后,还有进位,因此需要把进位存起来,之后再次相加,直到进位为0;那么进位怎么表示:进位用与表示,然后再左移上面步骤循环,直到进位等于0代码如下:原创 2021-06-05 18:42:30 · 159 阅读 · 0 评论 -
剑指offer JZ29 最小的K个数(最小堆,以及最大堆)
题目描述:给定一个数组,找出其中最小的K个数。例如数组元素是4,5,1,6,2,7,3,8这8个数字,则最小的4个数字是1,2,3,4。如果K>数组的长度,那么返回一个空的数组思路:最小堆;最小堆的堆顶是整个堆的最小数代码如下:class Solution {public: vector<int> GetLeastNumbers_Solution(vector<int> input, int k) { vector<int>res原创 2021-05-29 17:09:46 · 170 阅读 · 0 评论 -
剑指offer JZ28 二叉搜索树的后序遍历序列
题目描述:输入一个整数数组,判断该数组是不是某二叉搜索树的后序遍历的结果。如果是则返回true,否则返回false。假设输入的数组的任意两个数字都互不相同。(ps:我们约定空树不是二叉搜素树)思路:一、递归二叉搜索树的左右子树都是二叉搜索树,因此可以利用递归,判断每个子树是不是二叉搜索树利用一个辅助函数,实现递归首先判断这个数组的根节点是否满足二叉搜索树的要求然后可以拆成左右子树,再对左右子树进行同样的判断class Solution {public: bool help(vect原创 2021-05-28 09:26:47 · 189 阅读 · 0 评论 -
非递归快速幂 简单解释 C++
**题目描述:**实现 pow(x, n) ,即计算 x 的 n 次幂函数(即,xn)。leetcode 50leetcode 剑指offer 16剑指offer jz12思路:快速幂原文链接代码如下:class Solution {public: double myPow(double x, int n) { double res=1; long m=abs(n);//防止n是负数,转换成正数溢出 while(m){原创 2021-05-25 21:49:21 · 231 阅读 · 0 评论 -
经典动态规划 2个鸡蛋,100层楼问题
参考此处dp[n][m]表示n层楼m个鸡蛋时的最优解;在第i层,有j个鸡蛋时,本次测试鸡蛋卒,dp[i][j]=dp[i-1][j-1]+1(用剩下的j-1个鸡蛋测试i-1层),鸡蛋生还dp[i][j]=dp[n-i][j]+1(继续用j个鸡蛋测试剩下的n-i层);(取这两项的最大值,因为不知道到底是卒还是生还,所以要取最大值,以确保可以测试到)dp[i][j]=max(dp[i-1][j-1], dp[n-i][j])+1;代码如下:class Solution {public:原创 2021-04-22 15:28:07 · 520 阅读 · 0 评论 -
leetcode 回文字符串(总结)
一、LeetCode 647 回文子串题目描述:给定一个字符串,你的任务是计算这个字符串中有多少个回文子串。具有不同开始位置或结束位置的子串,即使是由相同的字符组成,也会被视作不同的子串。思路:循环遍历查找子串代码如下:class Solution {public: int countSubstrings(string s) { int n=s.size(); int res=0; vector<vector<原创 2021-04-19 21:58:08 · 1276 阅读 · 0 评论 -
leetcode 841 钥匙和房间(递归与迭代)
题目描述:有 N 个房间,开始时你位于 0 号房间。每个房间有不同的号码:0,1,2,…,N-1,并且房间里可能有一些钥匙能使你进入下一个房间。在形式上,对于每个房间 i 都有一个钥匙列表 rooms[i],每个钥匙 rooms[i][j] 由 [0,1,…,N-1] 中的一个整数表示,其中 N = rooms.length。 钥匙 rooms[i][j] = v 可以打开编号为 v 的房间。最初,除 0 号房间外的其余所有房间都被锁住。你可以自由地在房间之间来回走动。如果能进入每个房间返回 tr原创 2021-04-15 20:35:00 · 208 阅读 · 0 评论 -
leetcode 双指针、滑动窗口
一、LeetCode 1004 最大连续1的个数III题目描述:给定一个由若干 0 和 1 组成的数组 A,我们最多可以将 K 个值从 0 变成 1 。返回仅包含 1 的最长(连续)子数组的长度。思路:双指针表示滑动窗口左边界不动,右边界往右边滑动,寻找代码如下:class Solution {public: int longestOnes(vector<int>& A, int K) { int l=0,res=0,cnt=原创 2021-04-01 09:58:02 · 267 阅读 · 0 评论 -
LeetCode 456 132模式(单调栈)
题目描述:给定一个整数序列:a1, a2, …, an,一个132模式的子序列 ai, aj, ak 被定义为:当 i < j < k 时,ai < ak < aj。设计一个算法,当给定有 n 个数字的序列时,验证这个序列中是否含有132模式的子序列。注意:n 的值小于15000。思路:2表示第二大的数,放在最后面3表示最大的数,放在中间用一个递减的单调栈,表示3可能取得值,并让2仅次于3如果存在一个比2小的数,那么这个132模式存在代码如下:class Solut原创 2021-03-31 12:27:26 · 170 阅读 · 0 评论 -
leetcode 深度优先搜索与广度优先搜索 以及并查集
一、通俗解释:出处深度优先可以这样想,一个人迷路,遇到很多分叉路口,他只有一个人,并且想走出去,所以只能一个个尝试,一条道路走到黑,发现到头了,然后再拐回去走刚才这条路的其他分叉路口,最后发现这条路的所有分叉路口走完了,选择另外一条路继续以上操作,直到所有的路都走过了。广度优先并不是这样,一个人迷路,但是他有技能(分身术)它遇到分叉路口,不是选一个走,而是分身多个人都试试,比如有A、B、C三个分叉路口,它A路走一步,紧接着B路也走一步,然后C路也赶紧走一步,步伐整齐统一,直到所有的路走过了。广度优先并不原创 2021-03-31 12:28:29 · 316 阅读 · 0 评论 -
leetcode 403 青蛙过河(动态规划)
题目描述:一只青蛙想要过河。 假定河流被等分为若干个单元格,并且在每一个单元格内都有可能放有一块石子(也有可能没有)。 青蛙可以跳上石子,但是不可以跳入水中。给你石子的位置列表 stones(用单元格序号 升序 表示), 请判定青蛙能否成功过河(即能否在最后一步跳至最后一块石子上)。开始时, 青蛙默认已站在第一块石子上,并可以假定它第一步只能跳跃一个单位(即只能从单元格 1 跳至单元格 2 )。如果青蛙上一步跳跃了 k 个单位,那么它接下来的跳跃距离只能选择为 k - 1、k 或 k + 1 个单位原创 2021-03-31 12:30:21 · 669 阅读 · 0 评论 -
leetcode 打家劫舍(动态规划)
一、leetcode 198 打家劫舍I题目描述:你是一个专业的小偷,计划偷窃沿街的房屋。每间房内都藏有一定的现金,影响你偷窃的唯一制约因素就是相邻的房屋装有相互连通的防盗系统,如果两间相邻的房屋在同一晚上被小偷闯入,系统会自动报警。给定一个代表每个房屋存放金额的非负整数数组,计算你 不触动警报装置的情况下 ,一夜之内能够偷窃到的最高金额。思路:两种情况下的动态规划代码如下:class Solution {public: int rob(vector<int原创 2021-03-15 21:51:33 · 201 阅读 · 0 评论 -
leetcode 矩阵问题合集
一、leetcode 200 岛屿数量题目描述:给你一个由 ‘1’(陆地)和 ‘0’(水)组成的的二维网格,请你计算网格中岛屿的数量。岛屿总是被水包围,并且每座岛屿只能由水平方向和/或竖直方向上相邻的陆地连接形成。此外,你可以假设该网格的四条边均被水包围。思路:dfs代码如下:class Solution {public: int numIslands(vector<vector<char>>& grid) { int原创 2021-03-11 22:11:36 · 582 阅读 · 0 评论 -
leetcode 下降路径最小和(动态规划)
一、LeetCode 931 下降路径最小和题目描述:给你一个 n x n 的 方形 整数数组 matrix ,请你找出并返回通过 matrix 的下降路径 的 最小和 。下降路径 可以从第一行中的任何元素开始,并从每一行中选择一个元素。在下一行选择的元素和当前行所选元素最多相隔一列(即位于正下方或者沿对角线向左或者向右的第一个元素)。具体来说,位置 (row, col) 的下一个元素应当是 (row + 1, col - 1)、(row + 1, col) 或者 (row + 1,原创 2021-03-09 09:55:48 · 212 阅读 · 0 评论 -
leetcode 分割回文串(dfs、动态规划)
一、LeetCode 131 分割回文串题目描述:给你一个字符串 s,请你将 s 分割成一些子串,使每个子串都是 回文串 。返回 s 所有可能的分割方案。回文串 是正着读和反着读都一样的字符串。思路:dfs回溯算法代码如下:class Solution {public: vector<vector<string>> partition(string s) { vector<vector<string>>原创 2021-03-08 11:26:16 · 190 阅读 · 0 评论 -
leetcode 等差数列的划分(子数组、子序列)动态规划
一、leetcode 413 等差数列的划分–子数组题目描述(例子):A = [1, 2, 3, 4]返回: 3, A 中有三个子等差数组: [1, 2, 3], [2, 3, 4] 以及自身 [1, 2, 3, 4]。代码如下:class Solution {public: int numberOfArithmeticSlices(vector<int>& nums) { int n=nums.size(); vector&原创 2021-03-07 13:40:35 · 431 阅读 · 0 评论 -
leetcode 825 适龄的朋友(剪枝)
题目描述:人们会互相发送好友请求,现在给定一个包含有他们年龄的数组,ages[i] 表示第 i 个人的年龄。当满足以下任一条件时,A 不能给 B(A、B不为同一人)发送好友请求:age[B] <= 0.5 * age[A] + 7age[B] > age[A]age[B] > 100 && age[A] < 100否则,A 可以给 B 发送好友请求。注意如果 A 向 B 发出了请求,不等于 B 也一定会向 A 发出请求。而且,人们不会给自己发送好友请求。原创 2021-03-05 10:07:44 · 204 阅读 · 1 评论 -
leetcode 795 区间子数组个数(简单前缀和、子数组)
题目描述:给定一个元素都是正整数的数组A ,正整数 L 以及 R (L <= R)。求连续、非空且其中最大元素满足大于等于L 小于等于R的子数组个数。思路:最大元素满足大于等于L 小于等于R的子数组个数=最大元素满足 小于等于R-最大元素满足小于等于L-1代码如下:class Solution {public: int numSubarrayBoundedMax(vector<int>& A, int L, int R) { return he原创 2021-03-04 13:25:56 · 172 阅读 · 1 评论 -
LeetCode 354 俄罗斯套娃信封问题(一维动态规划)
题目描述:给定一些标记了宽度和高度的信封,宽度和高度以整数对形式 (w, h) 出现。当另一个信封的宽度和高度都比这个信封大的时候,这个信封就可以放进另一个信封里,如同俄罗斯套娃一样。请计算最多能有多少个信封能组成一组“俄罗斯套娃”信封(即可以把一个信封放到另一个信封里面)。说明:不允许旋转信封。思路:一维动态规划代码如下:class Solution {public: int maxEnvelopes(vector<vector<int>>& en原创 2021-03-04 09:21:40 · 176 阅读 · 1 评论 -
leetcode (矩阵中、数组中)的第k小的数(二分法)
一、LeetCode 378 有序矩阵中第K小的元素题目描述:给你一个 n x n 矩阵 matrix ,其中每行和每列元素均按升序排序,找到矩阵中第 k 小的元素。请注意,它是 排序后 的第 k 小元素,而不是第 k 个 不同 的元素。思路:二分查询代码如下:class Solution {public: int kthSmallest(vector<vector<int>>& matrix, int k) {原创 2021-03-04 09:19:50 · 628 阅读 · 0 评论 -
leetcode 1764 通过连接另一个数组的子数组(数组查询)
题目描述:给你一个长度为 n 的二维整数数组 groups ,同时给你一个整数数组 nums 。你是否可以从 nums 中选出 n 个 不相交 的子数组,使得第 i 个子数组与 groups[i] (下标从 0 开始)完全相同,且如果 i > 0 ,那么第 (i-1) 个子数组在 nums 中出现的位置在第 i 个子数组前面。(也就是说,这些子数组在 nums 中出现的顺序需要与 groups 顺序相同)如果你可以找出这样的 n 个子数组,请你返回 true ,否则返回 false 。如果不存原创 2021-03-01 10:41:14 · 183 阅读 · 0 评论 -
面试题16.10 生存人数(前缀和)
题目描述:给定 N 个人的出生年份和死亡年份,第 i 个人的出生年份为 birth[i],死亡年份为 death[i],实现一个方法以计算生存人数最多的年份。你可以假设所有人都出生于 1900 年至 2000 年(含 1900 和 2000 )之间。如果一个人在某一年的任意时期处于生存状态,那么他应该被纳入那一年的统计中。例如,生于 1908 年、死于 1909 年的人应当被列入 1908 年和 1909 年的计数。如果有多个年份生存人数相同且均为最大值,输出其中最小的年份。示例:输入:birt原创 2021-02-26 13:40:00 · 156 阅读 · 0 评论 -
leetcode 子数组(前缀和)
一、leetcode 930 和相同的二元子数组题目描述:在由若干 0 和 1 组成的数组 A 中,有多少个和为 S 的非空子数组。思路:哈希表+前缀和代码如下:class Solution {public: int numSubarraysWithSum(vector<int>& A, int S) { int res=0; int n=A.size(); vector<int>sum(n+原创 2021-01-25 21:00:10 · 273 阅读 · 0 评论 -
LeetCode 滑动窗口
一、LeetCode 1052 爱生气的书店老板题目描述:今天,书店老板有一家店打算试营业 customers.length 分钟。每分钟都有一些顾客(customers[i])会进入书店,所有这些顾客都会在那一分钟结束后离开。在某些时候,书店老板会生气。 如果书店老板在第 i 分钟生气,那么 grumpy[i] = 1,否则 grumpy[i] = 0。 当书店老板生气时,那一分钟的顾客就会不满意,不生气则他们是满意的。书店老板知道一个秘密技巧,能抑制自己的情绪,可以让自己连续 X 分钟不生原创 2021-01-25 14:27:20 · 106 阅读 · 0 评论 -
leetcode 优美的排列(回溯、找规律)
一、leetcode 526 优美的排列题目描述:假设有从 1 到 N 的 N 个整数,如果从这 N 个数字中成功构造出一个数组,使得数组的第 i 位 (1 <= i <= N) 满足如下两个条件中的一个,我们就称这个数组为一个优美的排列。条件:第 i 位的数字能被 i 整除i 能被第 i 位上的数字整除现在给定一个整数 N,请问可以构造多少个优美的排列?思路:回溯法代码如下:class Solution { int res=0;public: int原创 2021-01-22 21:52:10 · 157 阅读 · 0 评论 -
LeetCode 面试题17.22 单词转换(dfs+剪枝)
题目描述:给定字典中的两个词,长度相等。写一个方法,把一个词转换成另一个词, 但是一次只能改变一个字符。每一步得到的新词都必须能在字典中找到。编写一个程序,返回一个可能的转换序列。如有多个可能的转换序列,你可以返回任何一个。思路:回溯遍历 并剪枝代码如下:class Solution {public: bool canTranslate(string& from_,string& to_){ if(from_.size()!=to_.size()) re原创 2021-01-22 16:51:29 · 286 阅读 · 0 评论 -
leetcode 1366 通过投票对团队排名(map)
题目描述:现在有一个特殊的排名系统,依据参赛团队在投票人心中的次序进行排名,每个投票者都需要按从高到低的顺序对参与排名的所有团队进行排位。排名规则如下:参赛团队的排名次序依照其所获「排位第一」的票的多少决定。如果存在多个团队并列的情况,将继续考虑其「排位第二」的票的数量。以此类推,直到不再存在并列的情况。如果在考虑完所有投票情况后仍然出现并列现象,则根据团队字母的字母顺序进行排名。给你一个字符串数组 votes 代表全体投票者给出的排位情况,请你根据上述排名规则对所有参赛团队进行排名。请你返回能原创 2021-01-22 15:30:52 · 419 阅读 · 0 评论 -
LeetCode 对角线遍历(找规律)
一、LeetCode 498 对角线遍历题目描述:给定一个含有 M x N 个元素的矩阵(M 行,N 列),请以对角线遍历的顺序返回这个矩阵中的所有元素,对角线遍历如下图所示。思路:参考题解代码如下:class Solution {public: vector<int> findDiagonalOrder(vector<vector<int>>& matrix) { if(matrix.empty()) return原创 2021-01-22 10:26:02 · 244 阅读 · 0 评论 -
leetcode 最多能完成排序的块(找规律、单调栈)
一、leetcode 769 最多能完成排序的块I题目描述:数组arr是[0, 1, …, arr.length - 1]的一种排列,我们将这个数组分割成几个“块”,并将这些块分别进行排序。之后再连接起来,使得连接的结果和按升序排序后的原数组相同。我们最多能将数组分成多少块?思路:如果从当前位置i处,能分成两半那么只有前i个数的最大值等于i时,才能分成两半说明:如果前i个数的最大值是i,那么前面的数都小于i,相当于0-i之间的数乱序了代码如下:class Solution {pu原创 2021-01-21 20:39:42 · 240 阅读 · 0 评论 -
leetcode 石子游戏合集(动态规划)
一、LeetCode 877 石子游戏题目描述:亚历克斯和李用几堆石子在做游戏。偶数堆石子排成一行,每堆都有正整数颗石子 piles[i] 。游戏以谁手中的石子最多来决出胜负。石子的总数是奇数,所以没有平局。亚历克斯和李轮流进行,亚历克斯先开始。 每回合,玩家从行的开始或结束处取走整堆石头。 这种情况一直持续到没有更多的石子堆为止,此时手中石子最多的玩家获胜。假设亚历克斯和李都发挥出最佳水平,当亚历克斯赢得比赛时返回 true ,当李赢得比赛时返回 false 。思路:首先找到状态转移原创 2021-01-21 10:43:54 · 1583 阅读 · 0 评论 -
leetcode 下一个更大的数(哈希表、单调栈)
一、LeetCode 496 下一个更大的数I题目描述:给你两个 没有重复元素 的数组 nums1 和 nums2 ,其中nums1 是 nums2 的子集。请你找出 nums1 中每个元素在 nums2 中的下一个比其大的值。nums1 中数字 x 的下一个更大元素是指 x 在 nums2 中对应位置的右边的第一个比 x 大的元素。如果不存在,对应位置输出 -1 。思路:暴力法+哈希表代码如下:class Solution {public: vector<int> n原创 2021-01-19 20:38:07 · 1180 阅读 · 0 评论 -
LeetCode 前缀和+哈希表
题目描述:给定一个二进制数组, 找到含有相同数量的 0 和 1 的最长连续子数组(的长度)。思路:首先把数组中是0的数,转换为-1然后利用前缀和哈希表代码如下:class Solution {public: int findMaxLength(vector<int>& nums) { int res=0; int sum=0; unordered_map<int,int>mp; for(in原创 2021-01-19 10:48:59 · 235 阅读 · 0 评论 -
LeetCode 二分法、双指针法
题目描述:给你一个整数数组 arr ,请你删除一个子数组(可以为空),使得 arr 中剩下的元素是 非递减 的。一个子数组指的是原数组中连续的一个子序列。请你返回满足题目要求的最短子数组的长度。思路:方法一:二分法方法二:双指针代码如下:二分法:class Solution {public: bool check(vector<int>&nums,int n,int mid){ if(mid==n-1) return true;原创 2021-01-15 13:25:22 · 299 阅读 · 0 评论