摘要: 题目链接:剑指 Offer 44. 数字序列中某一位的数字 方法:找规律 解题思路 找第$n$位对应的数为几位数; 找该数的具体值; 找第$n$位在该数中的第几位。 {:style="width:500px"} 代码 class Solution { public: int findNthDigit 阅读全文
posted @ 2023-04-08 23:57 lixycc 阅读(22) 评论(0) 推荐(0)
摘要: 题目链接:剑指 Offer 42. 连续子数组的最大和 方法:动态规划 解题思路 参考动态规划详细解析——剑指 Offer 42. 连续子数组的最大和 注意: 很多同学首先会想到同向双指针,实际上本题由于$nums$数组的某一个元素的下一个元素可正可负,导致同向双指针要求的单调性无法满足; 使用$d 阅读全文
posted @ 2023-04-08 23:55 lixycc 阅读(19) 评论(0) 推荐(0)
摘要: 题目链接:剑指 Offer 41. 数据流中的中位数 方法一:插入排序 解题思路 每次添加一个数字时,通过插入排序添加,需要返回中位数时,根据元素个数进行返回。 代码 class MedianFinder { private: vector<int> nums; public: /** initia 阅读全文
posted @ 2023-04-08 23:52 lixycc 阅读(38) 评论(0) 推荐(0)
摘要: 题目链接:1626. 无矛盾的最佳球队 方法一:子集型回溯 + 记忆化 解题思路 先对$scores$和$ages$数组进行预处理得到$pair<int, int> a[n]$数组,$a[i].first = score[i], a[i].second = ages[i]$,然后进行$sort$排序 阅读全文
posted @ 2023-04-08 23:50 lixycc 阅读(25) 评论(0) 推荐(0)
摘要: 题目链接:剑指 Offer 40. 最小的k个数 方法:排序 解题思路 基于比较的排序,最低时间复杂度为$O(nlogn)$,空间复杂度为$O(1)$; 哈希计数,时间复杂度为$O(n)$,但需要额外的空间。 代码 // 基于比较的排序 class Solution { public: vector 阅读全文
posted @ 2023-04-08 23:46 lixycc 阅读(18) 评论(0) 推荐(0)
摘要: 题目链接:剑指 Offer 37. 序列化二叉树 取巧做法 class Codec { private: TreeNode* root; public: // Encodes a tree to a single string. string serialize(TreeNode* root) { 阅读全文
posted @ 2023-04-08 23:39 lixycc 阅读(25) 评论(0) 推荐(0)
摘要: 题目链接:1012. 至少有 1 位重复的数字 方法:数位dp 解题思路 参考:数位 DP 通用模板,附题单(Python/Java/C++/Go) 注意:其中$isNum$是用来针对前导$0$可能影响结果而设置的标志,如$010$(即$10$)实际是没有重复的数字,而由于前导$0$的影响使得是有重 阅读全文
posted @ 2023-04-08 23:37 lixycc 阅读(40) 评论(0) 推荐(0)
摘要: 题目链接:剑指 Offer 36. 二叉搜索树与双向链表 方法一:回溯 解题思路 {:width=1000} 代码 class Solution { private: int mx = INT_MIN, mi = INT_MAX; Node* start = NULL, * end = NULL; 阅读全文
posted @ 2023-04-08 23:35 lixycc 阅读(28) 评论(0) 推荐(0)
摘要: 题目链接:1625. 执行操作后字典序最小的字符串 方法:bfs暴力搜索 解题思路 初始化队列$q$,若$q$不为空,取队首字符串和$ans$进行比较,取其中字典序小的字符串,然后队首字符串对于两种操作可以生成两个字符串,将其中未出现过(即未遍历过)的字符串加入$q$中,继续循环,直到队列为空,返回 阅读全文
posted @ 2023-04-08 23:32 lixycc 阅读(48) 评论(0) 推荐(0)
摘要: 题目链接:1616. 分割两个字符串得到回文串 方法:模拟 + 双指针 解题思路 题目要求,找一个合适的下标 $idx$ 将 $a$ 分割为 $a[0, idx]$ 和 $a[idx + 1, n - 1]$,同样的 $b$ 分割为 $b[0, idx]$ 和 $b[idx + 1, n - 1]$ 阅读全文
posted @ 2023-04-08 23:29 lixycc 阅读(42) 评论(0) 推荐(0)
摘要: 题目链接:2389. 和有限的最长子序列 方法:前缀和 + 二分查找 解题思路 根据题意,子序列与$nums$数组的元素顺序无关,因此可以先对$nums$从小到大排序,并计算前缀和$nums[i] += nums[i - 1]$,此时的$nums[i]$表示原来nums数组$[0, i]$的区间和。 阅读全文
posted @ 2023-04-08 23:28 lixycc 阅读(44) 评论(0) 推荐(0)
摘要: 题目链接:剑指 Offer 33. 二叉搜索树的后序遍历序列 方法:分治 解题思路 首先假设该序列能够构成某个二叉搜索树的后序遍历序列,那么这个序列会被分成3个部分:左子树序列,右子树序列,父节点,其中左右子树节点数可能为0; 现在就可以检查该序列是否符合这个规律,然后递归的判断子树是否符合规律。 阅读全文
posted @ 2023-04-08 23:25 lixycc 阅读(21) 评论(0) 推荐(0)
摘要: 题目链接:2488. 统计中位数为 K 的子数组 方法:前缀和 + 哈希 解题思路 根据题意可知,在$k$是中位数的子数组中,比$k$大的数 $-$ 比$k$小的数 $=$ $0$ || $1$。那么将两种状态,小于$k$置$-1$,大于$k$置$+1$,计算数组的前缀和$s$。 由于子数组要包含$ 阅读全文
posted @ 2023-04-08 23:21 lixycc 阅读(36) 评论(0) 推荐(0)
摘要: 题目链接:1615. 最大网络秩 方法:暴力求解 解题思路 初始化每个节点邻接点的数量以及用矩阵保存边的信息,暴力枚举节点对,取其中秩的最大值。 代码 class Solution { public: int maximalNetworkRank(int n, vector<vector<int>> 阅读全文
posted @ 2023-04-08 23:03 lixycc 阅读(36) 评论(0) 推荐(0)
摘要: 题目链接:1223. 掷骰子模拟 方法:回溯 + 记忆化搜索 解题思路 回溯要点 参数列表 根据题目中的操作确定在递归中需要用到的上一层的某个变量或性质。 递归边界 即递归的最底层,确定其返回值。 记忆化搜索 由于在递归中会重复计算某一状态的值,那么我们在第一次计算出来后将其保存在数组中,再下一次遇 阅读全文
posted @ 2023-04-08 23:02 lixycc 阅读(41) 评论(0) 推荐(0)
摘要: 题目链接:1605. 给定行和列的和求可行矩阵 方法:贪心 解题思路 参考:思路?一个动画秒懂!附优化写法(Python/Java/C++/Go) 代码 class Solution { public: vector<vector<int>> restoreMatrix(vector<int>& r 阅读全文
posted @ 2023-04-08 22:59 lixycc 阅读(53) 评论(0) 推荐(0)
摘要: 题目链接:1617. 统计子树中城市之间最大距离 方法:子集型回溯 + 判断连通 + 树的直径 解题思路 枚举所有可能的子树 参考:子集型回溯 判断当前的子树是否合法,即当前树是否连通,通过$dfs$从某一个节点开始遍历子树,若遍历节点数量不等于子树节点数量,则不连通; 计算以每一个子树节点为起点能 阅读全文
posted @ 2023-04-08 22:58 lixycc 阅读(45) 评论(0) 推荐(0)
摘要: 题目链接:剑指 Offer 51. 数组中的逆序对 方法一:归并排序 解题思路 逆序对:即后面的数大于前面的数; 归并排序: 先分,在此过程中会先递归的将序列分为一段一段序列,并且每段序列之间的先后顺序是不变的。 再治,也即归并,归并的过程中会将两段序列进行比较$(A,B,B在A的后面)$,当出现$ 阅读全文
posted @ 2023-04-08 22:56 lixycc 阅读(32) 评论(0) 推荐(0)
摘要: 题目链接:面试题 17.05. 字母与数字 方法:TwoSum 解题思路 (1)将字符量化为 $+1$,数字量化为 $-1$,那么当子数组的和$subSum = 0$时,表示子数组中的字符和数字的数量相等; (2)$subSum = s[j] - s[i],j >= i,i = 1, 2, ...$ 阅读全文
posted @ 2023-04-08 22:52 lixycc 阅读(34) 评论(0) 推荐(0)
摘要: 题目链接:108. 将有序数组转换为二叉搜索树 方法:递归建树 解题思路 每次选取中间的元素作为根节点,递归创建左右子树,就可以保证左右子树的高度差绝对值不超过1 代码 /** * Definition for a binary tree node. * struct TreeNode { * in 阅读全文
posted @ 2023-04-08 22:51 lixycc 阅读(20) 评论(0) 推荐(0)
摘要: 题目链接:1590. 使数组和能被 P 整除 方法:前缀和 + 哈希 解题思路 (1)要求$(sum - sunSum)$ % $p = 0$,即要求 $[sum - (s[j] - s[i])]$ % $p = 0$, 即 $sum$ % $p = (s[j] - s[i])$ % $p$,即 $ 阅读全文
posted @ 2023-04-08 22:48 lixycc 阅读(62) 评论(0) 推荐(0)
摘要: 题目链接:1. 两数之和 方法:哈希 解题思路 通过哈希记录每个$nums[i]$的下标$i$,然后遍历$nums$,找$target - nums[i]$的下标。 代码 class Solution { public: vector<int> twoSum(vector<int>& nums, i 阅读全文
posted @ 2023-04-08 22:47 lixycc 阅读(22) 评论(0) 推荐(0)
摘要: 题目链接:剑指 Offer 20. 表示数值的字符串 方法:模拟 解题思路 根据题意模拟,详情见代码注释。 代码 class Solution { public: bool isDecimal(string s){ int first_symbol = s.find_first_of('.'); / 阅读全文
posted @ 2023-04-08 22:45 lixycc 阅读(19) 评论(0) 推荐(0)
摘要: 题目链接:2379. 得到 K 个黑块的最少涂色次数 方法一:前缀和 解题思路 通过前缀和计算任意子区间 $[i, i + k - 1]$ 中字母 $W$ 的数量,$ans = min([i, i + k - 1].count('W'), i = 0, 1, ...)。$ 代码 class Solu 阅读全文
posted @ 2023-04-08 22:44 lixycc 阅读(42) 评论(0) 推荐(0)
摘要: 题目链接:剑指 Offer 47. 礼物的最大价值 方法:动态规划 解题思路 $当前位置的最大价值 = max(上方格子的最大价值,左边格子的最大价值) + 当前位置的价值$,即局部最优可以推出全局最优,简单递推即可。 代码 class Solution { public: int maxValue 阅读全文
posted @ 2023-04-08 22:41 lixycc 阅读(26) 评论(0) 推荐(0)
摘要: 题目链接:1599. 经营摩天轮的最大利润 方法:模拟 解题思路 模拟全部游客都进行游玩,计算其中能赚取的最大利润值以及对应的次数。 代码 class Solution { public: int minOperationsMaxProfit(vector<int>& customers, int 阅读全文
posted @ 2023-04-08 18:42 lixycc 阅读(59) 评论(0) 推荐(0)
摘要: 题目链接:1653. 使字符串平衡的最少删除次数 方法:动态规划 解题思路 对于字符串$s$,设使得字符串$s[0, i]$平衡的最小删除次数为$dp[i]$。 若$s[0, n - 2]$为平衡字符串,当$s[n-1]==b$时,则$dp[n-1] = dp[n-2]$;当$s[n-1]==a$时 阅读全文
posted @ 2023-04-08 18:38 lixycc 阅读(37) 评论(0) 推荐(0)
摘要: 题目链接:1096. 花括号展开 II 方法:DFS由内向外展开 解题思路 ylb:[Python3/Java/C++/Go/TypeScript] 一题一解:递归(简洁代码) 代码 class Solution { private: set<string> s; void dfsBrace(str 阅读全文
posted @ 2023-04-08 18:36 lixycc 阅读(23) 评论(0) 推荐(0)
摘要: 题目链接:982. 按位与为零的三元组 方法一:枚举(超时) 解题思路 直接枚举$i, j, k$分别取$[0, n-1]$,判断$($$nums[i]$ & $nums[j]$ & $nums[k]$$)$ $==$ $0$。由于本题的数量级较大 $n = 1000$,$n^3 = 10^9$,会 阅读全文
posted @ 2023-04-08 18:35 lixycc 阅读(66) 评论(0) 推荐(0)
摘要: 题目链接:1487. 保证文件名唯一 方法:哈希表 解题思路 设文件名s对应的出现次数为$cnt[s]$,当前需要创建的文件夹名为$names[i]$,会有两种情况: 当前文件夹名为出现过,则$cnt[names[i]] = 1$; 当前文件名之前出现过,则更新其后缀名$(cnt[names[i]] 阅读全文
posted @ 2023-04-08 18:27 lixycc 阅读(45) 评论(0) 推荐(0)
摘要: 题目链接:面试题 05.02. 二进制数转字符串 方法:找规律 解题思路 (1)题目要求:将一个$0-1$之间的实数通过二进制进行表示,并通过字符串形式输出。 (2)由于二进制的小数只能表示$\frac{1}{2} \frac{1}{4} \frac{1}{8} ... \frac{1}{2^n}$ 阅读全文
posted @ 2023-04-08 18:26 lixycc 阅读(33) 评论(0) 推荐(0)
摘要: 题目链接:剑指 Offer 19. 正则表达式匹配 方法:动态规划 解题思路 详情见:逐行详细讲解,由浅入深,dp和递归两种思路 代码 class Solution { public: bool isMatch(string s, string p) { int n = s.size(), m = 阅读全文
posted @ 2023-04-08 18:18 lixycc 阅读(21) 评论(0) 推荐(0)
摘要: 题目链接:2363. 合并相似的物品 方法一:归并 解题思路 先对两个整数数组进行$sort$排序,然后对两个数组进行归并操作。 代码 class Solution { public: vector<vector<int>> mergeSimilarItems(vector<vector<int>> 阅读全文
posted @ 2023-04-08 18:17 lixycc 阅读(41) 评论(0) 推荐(0)
摘要: 题目链接:1144. 递减元素使数组呈锯齿状 方法:找规律 + 模拟 解题思路 对于一个整数数组 $nums$,可以转换为题目中两种锯齿数组,对于两种情况的转换取最小值。 并且由于操作只能将一个元素减1,因此: 对于第1种情况,只用下标为奇数的元素需要减小到比两边最小值小1; 对于第2种情况,只用下 阅读全文
posted @ 2023-04-08 18:14 lixycc 阅读(20) 评论(0) 推荐(0)
摘要: 题目链接:2574. 左右元素和的差值 方法:前缀和 + 后缀和 解题思路 第一遍算出 $nums$ 数组前缀和,第二遍计算 $answer$ 数组。 代码 class Solution { public: vector<int> leftRigthDifference(vector<int>& n 阅读全文
posted @ 2023-04-08 18:10 lixycc 阅读(38) 评论(0) 推荐(0)
摘要: 题目链接:1255. 得分最高的单词集合 方法:暴力回溯 解题思路 观察可以发现,本题的数据量范围较小,使用暴力回溯不超过$2^1$$^4$次,需要注意的有,当选择一个单词时,必须保证当前提供的字符集合中剩余字符能够组成该单词$check()$,选择以后将字符集合中对应字符数量减少$destroy( 阅读全文
posted @ 2023-04-08 18:08 lixycc 阅读(37) 评论(0) 推荐(0)
摘要: 题目链接:[1247. 交换字符使得字符串相同] 方法:找规律 解题思路 由于只能两个字符串之间交换字符,单个字符串内不允许交换,因此如果只有一个字符对不相同,那么一定无法通过交换变为相同字符串,同理当不相同的字符对为奇数时,也无法通过交换变为相同字符。 当不相同的字符对数为偶数时,现在考虑以下几种 阅读全文
posted @ 2023-04-08 18:04 lixycc 阅读(38) 评论(0) 推荐(0)
摘要: 题目链接:1238. 循环码排列 方法:格雷码 解题思路 令 $N = 2^n-1$,将 $i = 0, ... , N,$ 分别转换为其对应的格雷码,用 $g$ 数组存储,即 $g[i]$ 表示 $i$ 对应的格雷码的十进制的值。由于题目中 $start$ 表示的是格雷码的十进制值,且返回的为格雷 阅读全文
posted @ 2023-04-08 18:00 lixycc 阅读(138) 评论(0) 推荐(0)
摘要: 题目链接:1140. 石子游戏 II 方法一:dfs(超时) 解题思路 题目要求$Alice$取得的石子数尽可能的多,那么就要使得$Bob$取得的石子尽可能的少,但是$Bob$也想要取得更多的石子,因此$Alice$在每次选取时,要使得在此种选取方法下,$Bob$能取的石子数最小。 现定义$dfs( 阅读全文
posted @ 2023-04-08 17:53 lixycc 阅读(50) 评论(0) 推荐(0)
摘要: 题目链接:1326. 灌溉花园的最少水龙头数目 方法:贪心 解题思路 每次到达端点l时,寻找在此处能够到达的最远右端点; 思路一: 先对每个水龙头能够覆盖的 $[l, r]$ 构成的数组 $rg$ 按照 $l$ 进行从小到大排序,然后遍历右端点 $r=[0, n]$,对于当前 $r$,在 $rg$ 阅读全文
posted @ 2023-04-08 17:49 lixycc 阅读(44) 评论(0) 推荐(0)
摘要: 题目链接:1792. 最大平均通过率 方法:优先队列 解题思路 (1)为了使得平均通过率最大化,应使得所有班级的总通过率最大,那么 $extraStudents$ 学生应该使得某一个班级的通过率增加量最大,才添加到该班级中。因此可以使用优先队列,确定优先级,每次为 $q.top()$ 的班级添加学生 阅读全文
posted @ 2023-04-08 01:45 lixycc 阅读(38) 评论(0) 推荐(0)