
LeetCode初级算法题
C+G
也就那样
展开
-
leetcode每日一题——进制的转化(顺便总结下位取得后的处理方式)
文章目录题目解析和总结题目题目链接解析和总结这类题型的关键,就在于取位后根据取位的方向来确定可视化的呈现。比如从低到高取位,或者是从高到低取位。此题(数字转字符串):(假设转R进制)%R再/R从低位开始取,比如102%10取得的是2,/=10后得到10,以此类推。我们还需要将位进行正确的排列,由于我们的可视化采取的是十进制,所以应该把每一位对应到10进制的每一位上。故直接 位的数字*该位对应的幂 可以将其放到对应的可视化位置。代码如下:class Solution {public原创 2022-03-07 20:43:47 · 689 阅读 · 0 评论 -
翻牌的数论推倒题——319. 灯泡开关
文章目录题目题目解析解题代码题目OJ平台题目解析曾经做过一道一模一样的题目:翻扑克牌的题目题目描述如下:首先我们应该很快清楚:被翻牌奇数次的牌肯定是正面朝上。被翻牌偶数次的牌肯定是背面朝上。继续观察:第一次—— 1*2、2*2、2*3…第二次—— 1*3、2*3、3*3…我们发现:某个数的翻牌次数,就是他的因数个数(除去1),比如4的因数有1、2、4,所以除去1有两个,所以翻两次牌。最后给出结论:由于有这个规律,所以只要因数有奇数个则对应翻牌偶数次——所以只有完全平方数满足原创 2021-11-15 12:37:59 · 2924 阅读 · 0 评论 -
leetcode打卡——区间维护问题——495. 提莫攻击
文章目录题目题目解析解题代码题目OJ平台题目解析维护 [l,r] 区间,根据题目给出的时间都是从小到大有序,所以通过判断与右极限位置的关系即可判断是否超出区间。分类讨论:如果给出的时间未超出现有的中毒时间,则扩大当前中毒右区间。如果给出的时间超出现有的中毒时间,则说明会产生一个新的中毒区间,所以进行时间的更新,然后维护新的中毒区间。最后肯定是会有一个中毒区间没有被计算,所以再次计算即可。解题代码class Solution {public: int findPoiso原创 2021-11-10 13:47:48 · 1018 阅读 · 0 评论 -
leetcode打卡——299. 猜数字游戏(求交集or标记法)
文章目录题目题目解析解题代码法一法二题目oj平台题目解析题目有两种思路:直接计算两个字符串的各个字母的出现频次,把位置相同得到res1(不计算在内),然后求两者的交集(最小值)即为res2。直接遍历两次,第一次求res1,第二次求res2,第一次用不可能的字符进行标记,方便第二次识别。解题代码法一class Solution {public: string getHint(string secret, string guess) { int bulls原创 2021-11-08 19:23:23 · 137 阅读 · 0 评论 -
leetcode打卡——598. 范围求和 II
题目OJ平台题目解析由于是以 (a,b) 为右下角的顶点与 (0,0) 所形成的矩形,所以每次进行加和的区域实际是可知的,而题目只需要求出最大的加和区域,所以实际上就是求交集,而这题的交集只需要看一个点,所以很简单的就维持一个坐标就行了。解题代码cppclass Solution {public: int maxCount(int m, int n, vector<vector<int>>& ops) { int mina = m,原创 2021-11-07 15:37:47 · 1044 阅读 · 0 评论 -
蓝桥杯——(用多少个的最好情况的依赖关系)乘积最大
文章目录题目题目解析解题代码题目OJ平台题目解析看完题目,很明显,我们可以直接暴力添加 ‘*’ 完成题目,但这样反而让题目复杂化了。。。这题很明显考察的是dp关系,为什么这么说?关于 k 个 '*' 号的添加,它肯定和 k-1 个 '*' 时的状态有关的!只需要关注 k-1 和 k 状态之间的关系即可!得出下面的状态转移方程即可://dp[i][j]代表到下标i的字符串,用j个 * 分割后的最大乘积dp[i][j] = max(dp[i][j],dp[k][j-1]*sustr(k,i原创 2021-11-06 20:31:13 · 95 阅读 · 0 评论 -
leetcode打卡——268. 丢失的数字(简单题见真功夫)
文章目录题目题目解析解题代码原地数组交换法根据特点异或解法题目OJ平台题目解析排序,然后判断原地数组交换,然后判断由于已经知道了数据范围,而且仅缺失一个元素,所以衍生出两种做法:(1 直接求数据总和,然后减去真实总和。(2 直接和对应的下标异或,很明显留下来的就是答案。工具法:直接用哈希表存下,然后判断解题代码原地数组交换法class Solution {public: int missingNumber(vector<int>& nums) {原创 2021-11-06 15:04:58 · 443 阅读 · 0 评论 -
leetcode打卡——去重之575. 分糖果
文章目录题目题目解析解题代码unordered_set法bitset法题目题目解析看完题目很快想到先计数出种类个数,然后直接可以得出答案了。。那么计数的方式最快的当然是哈希。而哈希中最快的当然是原生数组哈希,由于给出了数据范围,所以可以直接用原生数组哈希!关于原生数组哈希,就不得不提一嘴bitset,具体使用的文档在这里:bitset文档解题代码unordered_set法class Solution {public: int distributeCandies(vect原创 2021-11-01 14:40:43 · 96 阅读 · 0 评论 -
leetcode打卡——500. 键盘行
文章目录题目解题代码法一:哈希表存储法二:字母映射行题目解题代码首先给大家普及一下位运算转大小写等情况:字母大小写翻转–a^32字母全转小写–a|32字母全转大写–a&-33法一:哈希表存储class Solution {public: unordered_set<char>check[3]; void update(string & s,int p){//更新三个哈希表 for(auto&& t:s){原创 2021-10-31 13:28:25 · 169 阅读 · 0 评论 -
leetcode打卡--240. 搜索二维矩阵 II
文章目录题目一题三解直接搜索二分查找*(重点)二叉搜索树题目一题三解直接搜索class Solution {public: bool searchMatrix(vector<vector<int>>& matrix, int target) { for (const auto& row: matrix) { auto it = lower_bound(row.begin(), row.end(), targe原创 2021-10-25 16:28:52 · 170 阅读 · 0 评论 -
leetcode打卡--66. 加一
文章目录题目解题分析解题代码题目解题分析对于数组类型+1或者-1,很明显属于大数模拟加减的过程,我们需要考虑为9进1的特殊情况。解题代码Cpp代码class Solution {public: vector<int> plusOne(vector<int>& digits) { int len = digits.size(); for(int i=len-1;i>=0;i--){ if(di原创 2021-10-21 21:57:24 · 200 阅读 · 0 评论 -
leetcode打卡--453. 最小操作次数使数组元素相等[关于数学的等效替代法]
文章目录题目题目解析解题代码暴力模拟(超时)等效替代题目题目描述:给你一个长度为 n 的整数数组,每次操作将会使 n - 1 个元素增加 1 。返回让数组所有元素相等的最小操作次数。示例1:输入:nums = [1,2,3]输出:3解释:只需要3次操作(注意每次操作会增加两个元素的值):[1,2,3] => [2,3,3] => [3,4,3] => [4,4,4]示例2:输入:nums = [1,1,1]输出:0题目解析关于这题,最开始我也没原创 2021-10-20 19:28:18 · 539 阅读 · 3 评论 -
leetcode每日打卡--476. 数字的补数
文章目录题目题目解析解题代码题目题目描述:对整数的二进制表示取反(0 变 1 ,1 变 0)后,再转换为十进制表示,可以得到这个整数的补数。例如,整数 5 的二进制表示是 “101” ,取反后得到 “010” ,再转回十进制表示得到补数 2 。给你一个整数 num ,输出它的补数。示例1:示例2:题目解析注意num都是大于0的数,而且注意int有32位,除了主数据以外前面都是0,所以如果直接取反是不行的。把前面的0都补为1,再取反。直接从后往前扫描手动取反。解原创 2021-10-18 21:37:52 · 278 阅读 · 0 评论 -
10.18--一下午连肝20道leetcode题(纯C实现)
文章目录题目20.有效的括号155.最小栈225.用队列实现栈232.用栈实现队列844.比较含退格的字符解题代码与分析20.有效的括号155.最小栈225.用队列实现栈232.用栈实现队列844.比较含退格的字符题目20.有效的括号155.最小栈225.用队列实现栈232.用栈实现队列844.比较含退格的字符解题代码与分析20.有效的括号很简单的栈的运用题,通过左右括号的限制栈的入和出。bool checkL(char x){ return x=='(原创 2021-10-18 19:57:16 · 288 阅读 · 0 评论 -
leetcode打卡--441. 排列硬币
文章目录题目解题思路法一:暴力遍历 O(N)法二:利用数学公式二分 O(logN)法三:数学求根公式法 O(1)题目题目描述你总共有 n 枚硬币,并计划将它们按阶梯状排列。对于一个由 k 行组成的阶梯,其第 i 行必须正好有 i 枚硬币。阶梯的最后一行 可能 是不完整的。题目要求给你一个数字 n ,计算并返回可形成 完整阶梯行 的总行数。示例解题思路法一:暴力遍历 O(N)class Solution {public: int arrangeCoins(int n)原创 2021-10-10 01:40:56 · 168 阅读 · 0 评论 -
链表中倒数第k个结点---快慢指针 or 一次递归迭代解决
文章目录题目法一:递归方式法二:快慢指针解决题目oj平台法一:递归方式C++函数递归:class Solution {public: ListNode* getKthFromEnd(ListNode* head, int k) { this->k = k; return getNode(head); }private: int k; ListNode* getNode(ListNode* head){ i原创 2021-09-02 13:39:56 · 142 阅读 · 0 评论 -
给定数额买物品最多数量的三种解法(计数排序、贪心、dp)
文章目录题目解法一(没错我开始竟然想到的是背包)解法二:朴素排序+贪心解法三:计数排序+贪心题目oj平台解法一(没错我开始竟然想到的是背包)可惜O(n^2)复杂度终究过不了(害我还优化了蛮久)class Solution {public: int maxIceCream(vector<int>& costs, int coins) { int n = costs.size(); int dp[coins+1];memset(dp原创 2021-07-02 02:31:45 · 1758 阅读 · 0 评论 -
数据结构题实操题:利用后序遍历的特点寻找最近公共祖先
文章目录题目题目解析解题代码解题代码题目OJ平台题目解析公共祖先一共会出现四种种情况:给出的两个结点在 root 结点的左右子树,则最近公共祖先就是 root 。给出的两个结点都在左子树,则最近公共祖先是左子树中先搜到的那个结点。给出的两个结点都在右子树,则最近公共祖先是右子树中先搜到的那个结点。左右子树都未找到给出的 p、q 结点,则不存在。由于都是通过先处理左右子树寻找,然后再在根节点处进行返回操作,这很明显就是一个后序遍历的过程,后序遍历的过程就是先处理左右子树然后再回到原创 2021-06-29 09:59:45 · 549 阅读 · 0 评论 -
不含0的二十六进制表示--Excle表列名称
文章目录题目解题分析代码题目解题分析这看似是一个二十六进制,实际上缺了个0,这导致如果出现10(26)等等需要有0来表示的,用平常方法会产生错位。比如52本来用26进制表示为20(16),在此处表示为AZ,其中Z代表26,A代表 1 ,1∗261+26=521*26^1+26 = 521∗261+26=52,而不含0的其他情况则和普通26进制求解方法一样,那么这种特殊情况该如何处理呢?只要一旦出现0->Z,我们就在x/26之后再减去1,这样可以抹平错位。代码class Solutio原创 2021-06-29 01:04:36 · 210 阅读 · 0 评论 -
判断重复子字符串(一般方法 和 高效判断法)
文章目录题目解题思路一般方法O(n^2)数学方法O(n)题目解题思路一般的解法:枚举子串长度,然后再对字符串进行验证,验证它是否是由这些子串组成。数学法:假设母串 S 是由子串 s 重复 N 次而成, 则 S+S 则有子串 s 重复 2N 次, 那么现在有: S=Ns , S+S=2Ns , 其中N>=2 。 如果条件成立, S+S=2Ns , 掐头去尾破坏 2个s ,S+S 中还包含 2*(N-1)s , 又因为 N>=2 , 因此 S 在 (S+S)[1:-1] 中必出现一次以上原创 2021-06-23 15:11:35 · 2856 阅读 · 1 评论 -
异或解码--(手写解题--字丑莫怪)这可能是一道简单的数学题,只不过用编程来实现
文章目录数学方式打开本题:编程实现本题:数学方式打开本题:编程实现本题:class Solution {public: vector<int> decode(vector<int>& encoded, int first) { vector<int>res; res.emplace_back(first); for(int i=0;i<encoded.size();i++){原创 2021-05-06 16:57:30 · 115 阅读 · 0 评论 -
每日一题(打家劫舍进化版)--删除并获得点数
文章目录题目:题目分析:题解一(建立一次性连续的房屋)题解二(一次遍历解决,建立非连续的多个连续房屋)题目:题目分析:看完题目,我们可以发现,取了某数字的值那么和该数字相邻(x-1和x+1)的数则都不能取,是不是很像打家劫舍,只是单个数字可能是不相邻的,但如果把他们看成一堆数字和出现次数组成的序列,如1:1,2:3,3:3那么我们完全就可以看作打家劫舍问题了,当我们取1就不能取2,取1 的所有结果就是1*1,同理取2不能取1和3,结果是2*3。我们把这样的次数*数字看作打家劫舍中每栋房屋的总金额原创 2021-05-05 19:00:29 · 163 阅读 · 0 评论 -
每日一题--砖墙--hash表的应用
题目:读完题,我们大概就可以思考:我们只要记录竖直方向上除去最左边和最右边,所有砖墙边缘连续的最大层数,然后拿总层数-这个最大层数,不就是穿过砖块的最小垂线吗?如何实现我们确定好思路以后,思考如何用代码实现,我们很快可以想到一个数据结构–hash表,我们对每层的砖块右侧到每层最左的距离进行hash存储,那么就可得到整砖块层某宽度的出现次数,那么出现次数就代表了连续边缘的层数。代码:class Solution {public: int leastBricks(vector<原创 2021-05-04 18:00:35 · 114 阅读 · 0 评论 -
刷题记录--1bit与2bit字符
文章目录题目:解法1:更新步长解法2:找寻规律贪心:题目:解法1:更新步长从头遍历到尾,更新步长,设置遍历条件,把不同情况分开。代码:class Solution {public: bool isOneBitCharacter(vector<int>& bits) { if(bits.size()<2) return true; int start = 0; //至于判断条件为什么要是原创 2021-05-03 20:54:13 · 548 阅读 · 0 评论 -
从leetcode刷题收获--多源bfs以及二维平面的多次dp
文章目录题目:多源bfs解法:二维平面的多次dp解法:题目:leetcode542矩阵读完题目的各位,有bfs基础的肯定第一时间就想到用bfs,但是很快又想到和我们平时做的求最短路径有些许不同,比如平时我们只需要从一个起点到一个终点的最短距离。而这道题是多个起点到终点的最短距离。这个时候,就需要多源bfs了。至于多源bfs,其实就是通过队列push进入的元素初始不止一个,而是多个,比如这题按照普通单源bfs的思路直接就取一个一个的从1开始遍历到最短距离了。然而多源的思路就是把所有的起点直接入队,原创 2021-05-03 20:02:06 · 245 阅读 · 0 评论 -
组合求和I和组合求和II的异曲同工分析--得到组合的套路
文章目录题目:解题分析:解题代码(效率都达到过0ms):组合求和I组合求和II题目:组合求和I:对给出的数字target在nums数组中找出和为target的组合,注意nums数组中没有重复的元素,且注意组合中可以出现重复的数字,但不能出现相同的组合。组合求和II:对给出的数字target在nums数组中找出和为target的组合,注意nums数组中含有重复元素,此次的组合中只是普通的nums的组合数,每个元素不可复用。解题分析:组合求和I:首先得让大家清楚求普通组合数的方法:写一原创 2021-05-03 01:25:49 · 202 阅读 · 0 评论 -
双向bfs--对九宫重排的降维打击
文章目录什么是双向bfs?如何写双向bfs?例子:九宫重排双向bfs代码对该题的单向bfs和双向bfs的效率对比:什么是双向bfs?普通的bfs是从一个顶点往下遍历,而双向bfs则是在已知终点的情况下,从两个端点轮流往下和往上遍历,直到出现一次与上一次遍历的层数重合,则答案就出来了。很明显出现写出双向bfs需要满足一个必要条件–必须知道终点。易于理解的图片如何写双向bfs?对于传统的bfs,我们都是直接通过队列来进行层序遍历,当遍历到某一层中的某个结点达到了终点,则遍历结束 。而对于原创 2021-05-02 17:09:47 · 250 阅读 · 0 评论 -
bfs(单向和双向)求解最短路径问题(也可理解为最小次数)--以开锁问题为例子
文章目录题目:解题代码--单向bfs:双向bfs:题目:碰到这种最少次数的问题,一下子就应该想到bfs,尤其是这种告诉终点的题目,还能用双向bfs进行优化。解题代码–单向bfs:就是正常的用队列实现层序遍历,每一层相当于走了一步,直到遍历到终点。class Solution {public: int openLock(vector<string>& deadends, string target) { unordered_set<str原创 2021-05-01 23:04:31 · 766 阅读 · 0 评论 -
另类树形结构的遍历题目--员工的重要性
文章目录题目:题解:DFS和BFS题目:看完题目是不是很快就会想到树形结构的遍历。可是给定的是id编号而不是直接的结点,所以我们可以用hash表先把id和结点对应起来,他就变成了树形结构的遍历了。题解:DFS和BFSclass Solution {public: unordered_map<int,Employee*>mp; int getImportance(vector<Employee*> employees, int id) {原创 2021-05-01 18:52:42 · 108 阅读 · 0 评论 -
缺失的数字三种解法(不包括hash表法。。)
文章目录题目解法一:强行排序双指针解法二:数学求和公式法解法三:位运算题目本题我不使用hash表法。。因为hash表实在是太没技术含量了。。解法一:强行排序双指针class Solution {public: int missingNumber(vector<int>& nums) { sort(nums.begin(),nums.end()); int n = nums.size(); int l = 0,r =原创 2021-05-01 00:37:30 · 533 阅读 · 1 评论 -
三种方法解决重复出现的数字II(hash表法、数学法、位运算)
题目:通解的一般方法:hash表法没什么好说的,直接接遍历一般数组创建hash表遍历以便hash表便能得到结果。时间复杂度是O(n)但空间复杂度也是O(n)代码class Solution {public: int singleNumber(vector<int>& nums) { int res = 0; unordered_map<int,int>hash; //更新hash表原创 2021-04-30 21:09:44 · 376 阅读 · 1 评论 -
简单题我重拳出击(顺便讲讲递归的几种形式与总结)--丑数I(明天冲丑数II)
题目:题目解读:当 n>0 时,若 n 是丑数,则 n 可以写成n=2a∗3b∗5c n = 2^a * 3^b*5^cn=2a∗3b∗5c特别的当a=b=c=1时,n=1。所以根据这个数学公式我们很快可以重拳出击了。只要能被这三个数字的其中一个整除,我们就一直除下去,若最后的结果为1,则就是丑数了!!代码:普通递推:class Solution {public: bool isUgly(int n) { if(n<=0) retur原创 2021-04-30 00:34:56 · 171 阅读 · 0 评论 -
深化双指针算法:从木桶效应的最大容器开始
题目:盛最多水的容器解题探讨:由于是在线性边界中求最大值的问题,题刷的多很容易联想到两个方法,一个是动态规划,另一个则是双指针。那么这么利用双指针呢?将双指针放入左右边界我们可以观察到,若再次移动边界。如果移动的是对应值较小的边界,则我们无法估量下一次是否增大,若移动的是对应值较大的边界,则下次的值必然会减少。根据这个我们便照到了左右指针的更新规律。代码:class Solution {public://利用双指针结合边界限制思路来更新答案,如左右指针指定了一个容器范围,则小的那个原创 2021-04-29 22:57:31 · 224 阅读 · 0 评论 -
暴力枚举法--蓄水
文章目录题目:解题的思考:解题代码:题目:蓄水解题的思考:对于该题采取暴力枚举法:求解前,我们知道蓄水肯定是发生在扩容之后。这样才能最优。根据缸中对水的需求最大的那个,得到最大蓄水次数k,方便后续从1~k枚举将每个水桶的容量 除以 蓄水次数并向上取整 得到每个水桶在该次数状况下至少需要的容量将至少需要的容量 与原容量相减 便可以得到在该蓄水次数情况下对应的扩容次数(由于每次扩容只能为1)将蓄水次数与扩容次数相加即为某次枚举的答案,一直枚举更新最大值即可解题代码:class S原创 2021-04-29 22:07:35 · 156 阅读 · 0 评论 -
(纯C实现)利用新学来的哈希表法判断质数来->加快分解因式的效率
文章目录如题分解因式:代码:如题分解因式:代码:#include<bits/stdc++.h>using namespace std;void Set(int);int a[10001];//得到是否为质数的hash表void Set(int n){ memset(a,-1,sizeof(a)); for(int i=2;i*i<=n;i++){ if(a[i]){ int j = i; while(i*j&l原创 2021-04-28 23:13:04 · 135 阅读 · 0 评论 -
(含图解)判断质数的方法(暴力法优化和高效方法)
OJ平台:判断质数暴力法优化版:将偶数排除在外,且去除了冗余的运算。class Solution {public: int countPrimes(int n) { if(n<3)return 0; int count = 1;//包括了2 //由于是计算小于n的所有质数,所以2-->0 //+=2排除偶数 for(int i = 3;i<n;i+=2){ if(i原创 2021-04-28 18:25:38 · 1029 阅读 · 0 评论 -
通过这道题,我了解了C++中字符串转数字,数字转字符串的方法。
文章目录方法:解题:题目:代码:方法:用C++中sstream库创建stringstream对象进行转化。具体示例:(此方法需要额外创建变量存储)//字符串转数字和数字转字符串都可以用该方法解决,用stringstream时都需要一个用于存储转化后结果的容器。#include <iostream>#include <sstream>using namespace std;int main(){ double x; string str;原创 2021-04-28 17:13:00 · 95 阅读 · 0 评论 -
最小栈--纯C解决
题目:实现一个O(1)时间复杂度搜索到最小值的栈代码:关键在于在入栈的同时进行最小值的比较和更新。入栈时入两次栈(除了空栈情况),保持栈顶是最小值。注意细节问题:空栈情况的pop,一个元素情况的pop空栈情况的push#define SIZE 15000typedef struct { int nums[SIZE]; int top;} MinStack;/** initialize your data structure here. */MinStack*原创 2021-04-28 16:00:03 · 125 阅读 · 0 评论 -
[纯C]剑指 Offer 43. 1~n 整数中1出现的次数(数位dp解决)
文章目录题目:数位dp详解题目:数位dp详解数位dp就是利用数组的深搜实现对0~nums区间内任意数字的操作,而dp就是进行了记忆化搜索。//首先要清楚数位dp的实质:对该数组形式存储的数字,对它的0~nums的所有数字进行相应的操作。这个时候就可想到数位dp。int a[12];//存储的数字的十进制 位数。//memo数组用于处理重复性记忆问题(备忘录)。记住还有limit变量用于判断是否被限制状态。//这里备忘录后面存储count的长度根据需求来,比如输入的十进制数字最大也就10位原创 2021-04-27 21:01:06 · 165 阅读 · 0 评论 -
最长(连续递增子序列和递增子序列)
文章目录求连续递增子序列(入门级别dp)求最长递增子序列(进阶)求连续递增子序列(入门级别dp)与最长递增子序列的共同点在于:答案在任意子序列中,只是这个是在连续子序列中。DP[i]的意义相同,都是表示以nums[i]为结尾的最长~class Solution {public: int findLengthOfLCIS(vector<int>& nums) { if(nums.size()==0) return 0;原创 2021-04-26 21:02:51 · 228 阅读 · 0 评论