
算法
xiexie1357
这个作者很懒,什么都没留下…
展开
专栏收录文章
- 默认排序
- 最新发布
- 最早发布
- 最多阅读
- 最少阅读
-
2148. 元素计数【力扣】
题意理解给定一个数组,找出任何一个数,存在一个严格大于这个数的数和一个严格小于这个数的数,统计这个数的数量问题分析模拟法先排序,再遍历每个数,只要不等于最大值和最小值就算一个O(N)其他此题思路容易被限制到排序,快排、选择、堆之类的。这题就是找出数,然后检查。思路不能被限制了。每一题都需要用空杯心态来解决。力扣链接class Solution {public: int countElements(vector<int>& nums)原创 2022-01-25 09:20:24 · 435 阅读 · 0 评论 -
89. 格雷编码【力扣】
题意理解给定一个整数,求出一个满足格雷编码的序列,序列长度2^(n-1)问题分析用回溯,剪枝。卡点有3个:1.是怎么对某一位取反。答案是异或+左移;2.怎么用回溯,保存一个当前结果的序列vector,当前序列和结果序列分开;3.怎么剪枝,当得到正确答案,直接跳出循环。设置一个flag标志位。其他这题做了一天。回溯是我的弱项,还是有些点有点卡,不过下次更好的。链接力扣class Solution {public: vector<int> grayCo原创 2022-01-08 22:28:09 · 501 阅读 · 0 评论 -
剑指 Offer 60. n个骰子的点数【力扣】
题意理解给定n个骰子,求n个骰子的和出现的概率,按照从小到大的顺序排列可能和的概率。问题分析用动规状态变量是 n个骰子和为s的概率。状态转移方程是 dp[n][s] = sum( dp[n-1][s-i]* 1.0 / 6 ) , 1 <= i <= 6;为了降低存储,可以保留两行。因为是double,所有 1/6改成1.0/6才能保留小数其他好题。加油学习的忽视的一个关键点是,不完全按照自己的思路来,学习别人的思路,偷懒,投机,用少的思维力和少的时间..原创 2021-10-18 21:42:26 · 226 阅读 · 0 评论 -
剑指 Offer 51. 数组中的逆序对【力扣】
题意理解给定一个数组,计算逆序对的个数问题分析用归并归并和逆序怎么关联?每次两个有序序列合并,对于左边的最小值放入最后序列的适合,最后序列左边的,比它小的,都是和逆序关系。问题转化为计算左边最小值放入最后序列时,右边序列已处理的元素个数。其他力扣链接class Solution {public: int mergeSort(vector<int>& nums, vector<int>& tmps, int l, int h)原创 2021-10-17 22:26:51 · 223 阅读 · 0 评论 -
剑指 Offer 44. 数字序列中某一位的数字【力扣】
题意理解给定一串连续数字连接起来的字符串,判断第n位数字是几?问题分析模拟法先判断是几位数,然后判断是那个数,最后判断数的第几位。其他难就难在怎么条件判断!力扣链接class Solution {public: int findNthDigit(int n) { if (n < 10) return n; int digit = 1; int start = 1; long long ind原创 2021-10-17 22:21:09 · 145 阅读 · 0 评论 -
剑指 Offer 43. 1~n 整数中 1 出现的次数【力扣】
题意链接给定一个数n,求1到n这些数中1出现的次数。问题分析动规有点难,问题转化为每一个位出现的次数。其他链接class Solution {public: int countDigitOne(int n) { long long i = 1, coef = 1, sum = 0, cur_sum = 0; if (n < 10) return 1; while(coef <= n) {原创 2021-10-17 11:52:22 · 133 阅读 · 0 评论 -
剑指 Offer 49. 丑数【力扣】
题意理解找出所有只有包含2,3,5因子的数,排序得到第n个数。问题分析思路奇特用最小堆,用最小数乘2,3,5,放入堆,有重复,剔除重复数,每次把最小数删除,最小数一定是最小的。但是堆里其他数不一定是最小的。其他学习链接class Solution {public: int nthUglyNumber(int n) { if (n == 1) return 1; priority_queue<long, vector<lo原创 2021-10-16 21:04:07 · 118 阅读 · 0 评论 -
剑指 Offer 37. 序列化二叉树【力扣】*
题意理解给定一个二叉树,将它序列化出一个字符串,再反向生成原来的二叉树问题分析设计字符串间隔,外加上叶子节点左右空子树的标志。其他之前做出来过,现在又不会了。说明挺难的链接/** * Definition for a binary tree node. * struct TreeNode { * int val; * TreeNode *left; * TreeNode *right; * TreeNode(int x) : val(原创 2021-10-16 19:58:57 · 101 阅读 · 0 评论 -
剑指 Offer 67. 把字符串转换成整数【力扣】
题意理解给定一个字符串,按照规则转换成整数,如果大于INT_MAX,设置为INT_MAX;如果小于INT_MIN,设置为INT_MIN;如果不是整数,设置成0问题分析自动状态机+整数边界判断。其他链接class Solution {public: int strToInt(string str) { enum STATUS_TYPE { START, ONE, TWO,..原创 2021-10-13 23:50:50 · 118 阅读 · 0 评论 -
剑指 Offer 20. 表示数值的字符串【力扣】
题意理解给定一个字符串,指定数值的格式规范,判断字符串是不是一个数值。问题分析用自动状态机,最难的是设计状态和状态变迁的过程,如下图。状态机的优点是清晰,方便修改。其他力扣状态机是解复杂校验的最佳方法,化烦为简,主观能动性的深刻体现。链接class Solution {public: bool isNumber(string s) { enum STATUS_TYPE { START, ON.原创 2021-10-13 22:40:41 · 111 阅读 · 0 评论 -
剑指 Offer 59 - II. 队列的最大值【力扣】
题意理解设计一个类,要求对队列的插入,删除,取最大值都是O(1)问题分析用普通队列解决插入,删除解决常量复杂度。用双端队列+单调递减队列解决最大值常量复杂度。其他力扣链接class MaxQueue {public: MaxQueue() { } int max_value() { if (my_que.size() == 0) { return -1; } else原创 2021-10-12 22:42:23 · 112 阅读 · 0 评论 -
剑指 Offer 20. 表示数值的字符串【力扣】
题意理解给定一个字符串,判断是不是数值,数值包括小数,整数,科学计数格式三种,可以带+-;问题分析动规,一层层判断,包括整数判断,小数判断,其他花了好长时间,思路要整理整理,虽然做出来了,不过很多条件没有考虑到。链接class Solution {public: bool isNumber(string s) { int len = s.size(); int low = 0, high = len - 1; //cou原创 2021-10-06 21:52:47 · 144 阅读 · 0 评论 -
剑指 Offer 29. 顺时针打印矩阵【力扣】
题意理解给定一个矩阵,按照棒棒糖顺时针旋转,得到一个数组,打印该数组问题分析设置一个访问过数组,一个大循环内套4个小循环,分别是上,右,下,左。大循环条件是长度等于矩阵元素数量。其他力扣这个就是模拟,搞清楚就可以了。链接class Solution {public: vector<int> spiralOrder(vector<vector<int>>& matrix) { vector<int&g原创 2021-10-06 13:08:57 · 128 阅读 · 0 评论 -
剑指 Offer 14- I. 剪绳子【力扣】
题意理解给定一个绳子,长度为n, 将它剪成任意小段,求小段长度乘积最大的剪法。问题分析用动规dp[i] 表示 i长度的绳子最大乘积。dp[0] = dp[1] = 1; 0 <= i <= n那么dp[i] = max(j * (i - j), j * dp[i - j]); 1 <= i <= j;其他力扣选取递归子结构始终是动规最难的部分。链接class Solution {public: int cutt...原创 2021-10-06 11:24:15 · 108 阅读 · 0 评论 -
剑指 Offer 36. 二叉搜索树与双向链表【力扣】
题意理解将二叉搜索树变成线索二叉树,双向链表连接。问题分析复杂的链表节点操作。其他力扣2021/10/4: 问题解决,一纸一笔一橡皮,半粗半细半投机链接/*// Definition for a Node.class Node {public: int val; Node* left; Node* right; Node() {} Node(int _val) { val = _val; le原创 2021-10-04 09:32:48 · 125 阅读 · 0 评论 -
剑指 Offer 68 - II. 二叉树的最近公共祖先【力扣】
题意理解求二叉树的最近公共祖先问题分析这题挺难的,好好想想先。其他力扣链接/** * Definition for a binary tree node. * struct TreeNode { * int val; * TreeNode *left; * TreeNode *right; * TreeNode(int x) : val(x), left(NULL), right(NULL) {} * }; */class So原创 2021-10-01 09:49:49 · 102 阅读 · 0 评论 -
剑指 Offer 64. 求1+2+…+n【力扣】
题意理解求1+2+...+n和,要求不用乘除,while,if,else,switch,case,条件表达式,问题分析不用这些,需要考虑那些可以替换,加减,逻辑表达式短路性质。n && n += sum(n-1);其他力扣链接class Solution {public: int sumNums(int n) { n && (n += sumNums(n-1)); return n; }.原创 2021-10-01 08:46:23 · 108 阅读 · 0 评论 -
剑指 Offer 45. 把数组排成最小的数【力扣】
题意理解给定一个正整数数组,问排列拼在一起拼成一个大数,求最小的数。问题分析排序,比较算法需要根据题意设计。通过两个数正拼反拼,比较出结果。越小排靠前。其他算法思路,全局排序和两两排序。可以移植同样的规则。减少打开规则分析的工作量。投机一波。力扣https://leetcode-cn.com/problems/ba-shu-zu-pai-cheng-zui-xiao-de-shu-lcof/solution/mian-shi-ti-45-ba-shu-zu-pai-cheng-z原创 2021-09-28 11:12:31 · 173 阅读 · 0 评论 -
剑指 Offer 10- I. 斐波那契数列【力扣】
题意理解fn+1=fn+fn-1问题分析递归慢。常规的用动规,时间复杂度on;用快速幂,时间复杂度olgn。其他力扣链接动规class Solution {public: int fib(int n) { if (n == 0) return 0; if (n == 1) return 1; long c = 1e9+7; // long a = fib(n-1) % c; // long原创 2021-09-20 17:22:33 · 185 阅读 · 0 评论 -
剑指 Offer 63. 股票的最大利润【力扣】
题意理解给出一组数字,选出两个数,两个数前小后大,最大差值是多少问题分析动规思想大问题转成小问题,小问题逐步扩大。这题考虑前n个数最大利润怎么计算,记录前n个数的最小值,计算最小值和当前值的差值就是当前的最大差值。其他链接力扣https://leetcode-cn.com/problems/gu-piao-de-zui-da-li-run-lcof/solution/gu-piao-de-zui-da-li-run-by-leetcode-sol-0l1g/class So原创 2021-09-20 09:35:47 · 137 阅读 · 0 评论 -
剑指 Offer 26. 树的子结构【力扣】
题意理解判断一个树下有没有另一个树问题分析用递归。子结构是当前节点为根是否相同。其他难力扣链接/** * Definition for a binary tree node. * struct TreeNode { * int val; * TreeNode *left; * TreeNode *right; * TreeNode(int x) : val(x), left(NULL), right(NULL) {} * };原创 2021-09-19 21:03:13 · 128 阅读 · 0 评论 -
剑指 Offer 32 - II. 从上到下打印二叉树 II【力扣】
题意理解按照层次从上到下打印二叉树问题分析用队列,通过队列长度限制读取的范围,保障二叉树打印效果。其他0919:勿自暴勿自弃圣与贤可训至链接/** * Definition for a binary tree node. * struct TreeNode { * int val; * TreeNode *left; * TreeNode *right; * TreeNode(int x) : val(x), left(NULL),原创 2021-09-19 17:04:22 · 103 阅读 · 0 评论 -
【力扣】剑指 Offer 58 - II. 左旋转字符串
题意理解给定一个字符串,长度为cnt,指定数字n,移动前n个字符到末尾,输出移动后的字符串问题分析通过3次调换实现第一次是前后调换第二次是调换前cnt-n个字符,调换后n个字符。即可完成。难点是:调换需要指定中间位置,以及对调的位置。花了好长时间。头疼。其他链接class Solution {public: string reverseLeftWords(string s, int n) { int cnt = s.size();原创 2021-09-15 10:31:33 · 113 阅读 · 0 评论 -
【力扣】1996. 游戏中弱角色的数量
题意理解给定一个二维数组,n*2,每行有前后两个元素,问,对于每行,如果存在一行,前后两个元素都比它大,那么就算一个,统计总个数。问题分析用到排序用到要给推理:就是按照第一个元素从大到小排序,当第一个元素相同,按照第二个元素从小到大排序,这样当第二个元素比最大的第二个元素小,说明前面出现了要求的元素,算一,反之,更新最大的第二个元素为当前第二个元素。其他力扣链接class Solution {public: int numberOfWeakCharacters(v原创 2021-09-14 22:48:25 · 163 阅读 · 0 评论 -
LCS 03. 主题空间【力扣】
题意理解有n个人做2n道题,每道题属于一种知识类型,问n个人最少做的题型有几种?问题分析贪心法其他链接原创 2021-07-03 18:08:08 · 187 阅读 · 0 评论 -
LCS 02. 完成一半题目【力扣】
题意理解有n个人做2n道题,每人只做一道题,每道题属于一种知识类型,问n个人最少做的题型有几种?问题分析贪心法要想遇到的知识类型最少,那么选择的题同知识类型越多越好。所以对2n题的知识类型计数,知识类型数量越多的题先选,直到选满n即可。其他模拟题,知识类型的编号看成知识类型的数量所以百思不得其解。链接class Solution {public: int halfQuestions(vector<int>& questions) { .原创 2021-06-27 17:15:38 · 211 阅读 · 0 评论 -
LCS 01. 下载插件【力扣】
题意理解下载插件,每分钟下载一个插件,每分钟可选策略有两个,一个是当前速度下载;一个是速度加倍同时后面下载速度都按新速度来。问下载n个插件最少需要几分钟?问题分析模拟+贪心题意比较绕,需要多解释下,对于当前一分钟来看,可以按照当前速度下载,也可以当前一分钟不下载只加倍再到下一分钟下载。所以思路是贪心,看看剩余插件数是不是小于速度的2倍,小的话就按当前速度下载。其他此题花的时间比较长,是因为加速时候需要一分钟,而且加倍可以翻番加倍。理解力啊。链接class Solution原创 2021-06-26 11:26:46 · 191 阅读 · 0 评论 -
5. 最长回文子串【力扣】
题意理解给定一个字符串,找出最长回文子串。问题分析用动规,思路是从每个字符开始递推,每次字符长度+1,判断回文的时候和之前的子串掐头去尾后剩下的子串关联起来,形成状态转移方程。其他本题的变化在于,动规的起点是多个,逐步扩展。注意这个思路的学习。链接class Solution {public: string longestPalindrome(string s) { int len = s.size(); if (len == 1) r原创 2021-04-25 22:54:52 · 200 阅读 · 0 评论 -
79. 单词搜索【力扣】
题意理解给定一个矩阵,矩阵是字母组成,对于一个字符串,找到一条字母组成的路径,使得字符串等于路径。问题分析回溯法设计回溯函数,要点是记得有一棵树,回溯是在树上做先序遍历。树的节点是状态变量,树的边是可选的取值,函数设计方法是1. 函数参数包括状态变量,树的可选取值集2.函数体分为两部分:1. 终止条件; 2. 递归条件;3.对于递归的数据,设计时当成黑盒,已经实现了,然后判断已经实现情况下如何后续处理。4. 复杂回溯逻辑设计扣的很细,每一步干什么,要处理什么事情,都要明确,整原创 2021-03-08 20:33:55 · 188 阅读 · 0 评论 -
78. 子集【力扣】
题意理解给定一个数组,求它的全部子集问题分析用回溯法待学习其他https://leetcode-cn.com/problems/subsets/链接class Solution {public: vector<vector<int>> subsets(vector<int>& nums) { vector<vector<int>> ans; vector<in原创 2021-02-28 22:11:40 · 132 阅读 · 0 评论 -
42. 接雨水【力扣】
题意理解给定高低不均匀的一组柱子高度,计算下雨后可以接住的雨水数量。问题分析用栈。思路还是放在入栈和出栈上。如果是下降,那么直接入栈。如果是上升,开始处理接住的雨水数量。每上升一次,计算接住的数量,一层一层往上累加其他https://leetcode-cn.com/problems/trapping-rain-water/submissions/此题甚难,明白了练好算法是要花时间的,如果喜欢,花再多的时间也愿意啊。链接class Solution {publi原创 2021-02-16 22:09:43 · 127 阅读 · 0 评论 -
1752. 检查数组是否经排序和轮转得到【力扣】
题意理解判断一个数组是否是排序或是轮转。问题分析分析规律,方向是前后位置大小,第一个和最后一个比较大小其他https://leetcode-cn.com/problems/check-if-array-is-sorted-and-rotated/链接class Solution {public: bool check(vector<int>& nums) { if (nums.size() == 0) return true;原创 2021-02-13 09:04:56 · 224 阅读 · 0 评论 -
20. 有效的括号【力扣】
题意理解给出()[]{}三种括号字符串,判断是否有效,两两配对成功。问题分析用栈,思路整理:1. 考虑两个方向的处理,一个入栈如何操作,一个出栈如何操作。2. 考虑用map做字典,减少复杂if-else处理。其他https://leetcode-cn.com/problems/valid-parentheses/链接原始解法:class Solution {public: bool isValid(string s) { stack<原创 2021-02-10 09:17:26 · 109 阅读 · 0 评论 -
155. 最小栈【力扣】
题意理解设计一个栈类,支持常量时间取栈内最小值问题分析本题解法很多,选取的解法的一个点值得借鉴:空间换时间,开辟一个最小栈与原栈同步,最小栈内放入最大值,避免每次操作判断栈内有没有元素。其他链接https://leetcode-cn.com/problems/min-stack/class MinStack {public: /** initialize your data structure here. */ MinStack() { ..原创 2021-02-10 08:23:22 · 147 阅读 · 0 评论 -
【力扣】21. 合并两个有序链表
题意理解:合并两个有序链表l1,l2,合并后的链表有序。问题分析设合并是函数f,那么合并后的链表l3 = f(l1,l2)。l3 = f(l1,l2) = 当l1[0] < l2[0]时,l3 = l1[0] + f(l1[1:], l2); 其他, l3 = l2[0] + f(l1, l2[1:]).递归式如上。非递归情况:用了哑指针,和双指针法处理。其他https://leetcode-cn.com/problems/m...原创 2021-02-08 22:25:03 · 159 阅读 · 0 评论 -
【力扣】58. 最后一个单词的长度
题意理解给定一个仅包含大小写字母和空格' '的字符串 s,返回其最后一个单词的长度。如果字符串从左向右滚动显示,那么最后一个单词就是最后出现的单词。如果不存在最后一个单词,请返回 0。说明:一个单词是指仅由字母组成、不包含任何空格字符的 最大子字符串。问题分析字符串处理,倒遍历,注意区分第一个空和结束时的空。其他https://leetcode-cn.com/problems/length-of-last-word/链接class Solution {publi...原创 2021-01-28 22:03:32 · 229 阅读 · 1 评论 -
【力扣】1694. 重新格式化电话号码
题意理解给你一个字符串形式的电话号码 number 。number 由数字、空格 ' '、和破折号 '-' 组成。请你按下述方式重新格式化电话号码。首先,删除 所有的空格和破折号。其次,将数组从左到右 每 3 个一组 分块,直到 剩下 4 个或更少数字。剩下的数字将按下述规定再分块:2 个数字:单个含 2 个数字的块。3 个数字:单个含 3 个数字的块。4 个数字:两个分别含 2 个数字的块。最后用破折号将这些块连接起来。注意,重新格式化过程中 不应该 生成仅含 1 个数字的块,并且原创 2021-01-28 21:39:08 · 231 阅读 · 0 评论 -
【力扣】5661. 替换隐藏数字得到的最晚时间
题意理解给你一个字符串 time ,格式为 hh:mm(小时:分钟),其中某几位数字被隐藏(用 ? 表示)。有效的时间为 00:00 到 23:59 之间的所有时间,包括 00:00 和 23:59 。替换time 中隐藏的数字,返回你可以得到的最晚有效时间。问题分析难点在于怎么考虑全所有的时间数字组合。其他https://leetcode-cn.com/problems/latest-time-by-replacing-hidden-digits/链接clas..原创 2021-01-24 21:17:36 · 236 阅读 · 0 评论 -
【力扣】1721. 交换链表中的节点
题意理解给定一个链表,和一个整数k,交换第k个链表节点和倒数第k个链表节点问题分析先遍历一遍得到长度n再从头到尾遍历到第k-1个节点,记录下来再从头到尾遍历到第n-k个节点,记录下来交换第k个节点值和第n-k+1个节点的值。其他题目不难,但是如果不交换值而是交换节点,就很烦。链接https://leetcode-cn.com/problems/swapping-nodes-in-a-linked-list//** * Definition for singly原创 2021-01-11 23:14:36 · 161 阅读 · 0 评论 -
【力扣】1688. 比赛中的配对次数
题意理解给你一个整数 n ,表示比赛中的队伍数。比赛遵循一种独特的赛制:如果当前队伍数是 偶数 ,那么每支队伍都会与另一支队伍配对。总共进行 n / 2 场比赛,且产生 n / 2 支队伍进入下一轮。如果当前队伍数为 奇数 ,那么将会随机轮空并晋级一支队伍,其余的队伍配对。总共进行 (n - 1) / 2 场比赛,且产生 (n - 1) / 2 + 1 支队伍进入下一轮。返回在比赛中进行的配对次数,直到决出获胜队伍为止。问题分析每一轮次都会进行一次配对,每轮次的配对都会和上一轮次的配对有原创 2021-01-03 21:10:47 · 301 阅读 · 1 评论