
LeetCode
文章平均质量分 56
Shallow_Carl
Never Give Up!
展开
-
LRU缓存
题目描述请你设计并实现一个满足 LRU (最近最少使用) 缓存 约束的数据结构。实现 LRUCache 类: LRUCache(int capacity) 以 正整数 作为容量 capacity 初始化 LRU 缓存 int get(int key) 如果关键字 key 存在于缓存中,则返回关键字的值,否则返回 -1 。 void put(int key, int value) 如果关键字 key 已经存在,则变更其数据值 value ;如果不存在,则向缓存中插入该组 ke...原创 2022-03-19 13:35:01 · 1247 阅读 · 0 评论 -
四数之和一二
双指针+哈希map-----YYDS!!!原创 2022-02-22 14:28:59 · 245 阅读 · 0 评论 -
队列的最大值和滑动窗口的最大值
题目描述给定一个数组 nums 和滑动窗口的大小 k,请找出所有滑动窗口里的最大值。示例:输入: nums = [1,3,-1,-3,5,3,6,7], 和 k = 3输出: [3,3,5,5,6,7]解释: 滑动窗口的位置 最大值--------------- -----[1 3 -1] -3 5 3 6 7 31 [3 -1 -3] 5 3 6 7 31 3 [...原创 2022-01-25 22:47:20 · 177 阅读 · 0 评论 -
约瑟夫环数组解法
题目描述题目就是N个人,每第M号淘汰,输出最后选中的那位的序号.思路我们设置一个vector数组,每一个数组都是先预处理为下标 i 的数值,每一次第 M 号被淘汰,我们就选择将这个位的值置为-1,同时移动下标pos,自减一个提前设置好的初始值等于N的这样一个变量sum. 如果 当前位本来就是被访问过得,我们就移动到下一位.代码(逻辑很简单)class Solution {public: int lastRemaining(int n, int m) { vector<in原创 2022-01-20 20:52:32 · 898 阅读 · 0 评论 -
二叉树的后序遍历序列
题目描述思路说实话,我第一眼看到这个题目,一点思路都没有,除了知道二叉树后序遍历遵循"左右根"的遍历方式以外其他的什么都不知道,两眼一抹黑....后来看了题解又摸索着自己写,写来写去,都有问题,emmm,看别人写的十分简洁,自己写的一堆废话.实在是让我汗颜........后来不得已去看了K神的题解.K神,YYDS正文思想就是分治递归,我们寻找第一个大于最后一个元素的节点,保存这个位置的index,然后移动当前下标直到到达right,凭借postorder[right]将数..原创 2022-01-15 19:42:39 · 714 阅读 · 0 评论 -
数据流中的中位数
目录题目描述思路代码题目描述中位数是有序列表中间的数。如果列表长度是偶数,中位数则是中间两个数的平均值。例如,[2,3,4] 的中位数是 3[2,3] 的中位数是 (2 + 3) / 2 = 2.5设计一个支持以下两种操作的数据结构:void addNum(int num) - 从数据流中添加一个整数到数据结构中。double findMedian() - 返回目前所有元素的中位数。示例:addNum(1)addNum(2)findMedian() -原创 2022-01-11 17:26:46 · 131 阅读 · 0 评论 -
最小的K个数
题目描述思路一先排序,排完序后输出前K个数字即可,使用系统自带的sort函数.思路二使用一个堆来维持最小的K个数字,那么我们应该选择小根堆还是大根堆呢?我们如何使用小根堆,那么top函数返回值为当前的最小值,我们想要边遍历边更新堆,那么每次淘汰的都应该是当前堆里面最大的数值,那么应该使用大根堆这种数据结构,这种数据结构对应的是priority_queue<int> que;具体代码见下:代码class Solution {public: vect..原创 2022-01-11 15:01:50 · 312 阅读 · 0 评论 -
把数组排成最小的数
题目描述思路一开始我误解了题意,卡了半天不知道为啥错,最后发现对于23,20,2,2这四个数字,是不能拆分为2,3,2,0,2,2的.应该只是这几个数字的组合.那么我们如何判断30,34这两个数字到底是3034大,还是3430大呢?又比如34,3这两个数字,到底是343好呢,还是334好呢,比较两个字符串,我们就能知道应该选择哪一种组合方式,那么我们在使用algorithm头文件里面的sort()时,在写cmp函数时,逻辑就是比较两种不同的组合到底谁更小一些.代码class So..原创 2022-01-11 14:46:57 · 270 阅读 · 0 评论 -
最长不含重复字符的子字符串
题目描述思路状态方程:dp[i]表示以str[i]结尾的最长无重复字符的数量,对于当前的字符s[i],如果之前相同的字符出现在dp[i-1]之外的范围内,则dp[i]=dp[i-1]+1,如果出现在dp[i-1]之内的范围,那么dp[i]=i-temp.(temp表示上一次相同字符出现的位置,可以使用hash表的KEY-VAL来映射)初始化:dp[0]=1;递推顺序:从前到后代码class Solution {public: int lengthOf..原创 2022-01-07 20:13:53 · 341 阅读 · 0 评论 -
连续子数组的最大和
思路一--暴力破解思路二--动态规划动态规划五部曲:第一步:确定dp函数,dp[i]表示以nums[i]结尾的数组最大连续和第二步:确定递推公式:dp[i]=max(dp[i-1],nums[i]) ,直接判断之前的dp[i-1]是不是大于0也可以.第三步:确定递推顺序,从前到后 ,dp[i]由dp[i-1]推出,所以是从前到后第四步:初始化,dp[0]=nums[0], 因为dp数组表示以nums[i]结尾的最大连续和第五步:手动计算,同时输出日志来记录对照.#in...原创 2022-01-07 14:47:54 · 635 阅读 · 0 评论 -
股票的最大利润
前言:今天和女朋友分手了,十分emmmm怎么说呢,百感交集,剩下的还是些许的祝福,祝前途似海,再见时,依旧少年!目录思路一思路二----动态规划题目描述注意本题的只可以交易一次的这个条件思路一贪心算法:每一次记录到当前[0,i]之间的最小值,然后用当前prices[i]-min_price,迭代记录即可.class Solution {public: int maxProfit(vector<int>& prices)..原创 2022-01-06 16:00:40 · 272 阅读 · 0 评论 -
和为s的两个数字
一.题目描述二.思路一如果该数组不是排好顺序的,我们可以考虑使用hash表存储vector中的值,第二次遍历时直接就可以find(target-nums[i])?=map.end()class Solution {public: vector<int> twoSum(vector<int>& nums, int target) { unordered_map<int, int> map; for (a.原创 2022-01-04 17:04:58 · 478 阅读 · 0 评论 -
删除排序链表中的重复元素
题目描述思路一我们使用vector<int>的数据结构来存储链表节点,如果当前节点的元素和前一个节点的元素相同,就将该vector[i]和vector[i-1]标记为-101,再次遍历时,移动链表节点cur的同时对vector的遍历指针i做自增操作,如果是标记为,则进行改变pre->next思路二当下一个节点的值等于下下一个节点的值时,我们跳过下一个节点,当前节点的next指针直接指向下下一个节点,但是这也导致一个问题:比如1,2,2,,2,3,4,5这样的序列,我们.原创 2022-01-03 20:36:36 · 793 阅读 · 0 评论 -
链表中倒数第K个节点
题目描述思路一很明显的一个想法就是一遍遍历链表,记录链表长度n,第二次循环n-k次,就到了我们想要的节电处这个思路很简单,不值得深究.思路二这是我想着重记录的,"倒数"先关的题目,一般的优化思路都是快慢指针,因为快指针先移动K次,慢指针从头开始移动,快指针每一次都比慢指针快K格子,所以当快指针移动到指针末尾时,慢指针也就在倒数第K个位置了.AC代码如下:class Solution {public: ListNode* getKthFromEnd(ListNod..原创 2022-01-03 15:37:06 · 442 阅读 · 0 评论 -
复杂链表的复制
一.前言昨天下午刷这道题目时,刚开始看题,觉得题目说得很明白,首先想到"取巧",直接返回节点,结果题目输出直接就不爽了,emmm报错.没法子,开始正经思考.....二.难点这道题的难点在于如何让新创建出来的节点的random指针指向新创建的特点节点(而不是给定的节点),我一开始做题时也想到第一次遍历创建一个新的链表,只是对next节点赋值,random指针不管,然后第二遍遍历时懵圈了,直接让random指针指向题目给定的原来链表的random处....结果毫无疑问,报错了....三...原创 2021-12-31 12:22:16 · 197 阅读 · 0 评论 -
用两个栈实现队列
一.题目描述用两个栈实现一个队列。队列的声明如下,请实现它的两个函数 appendTail 和 deleteHead ,分别完成在队列尾部插入整数和在队列头部删除整数的功能。(若队列中没有元素,deleteHead 操作返回 -1 )示例 1:输入:["CQueue","appendTail","deleteHead","deleteHead"][[],[3],[],[]]输出:[null,null,3,-1]示例 2:输入:["CQueue","deleteHead","ap原创 2021-12-30 13:49:46 · 129 阅读 · 0 评论 -
C++优先队列
目录一.包含头文件二.初始化格式三.emplace()与push()一.包含头文件#include<queue> 既包含了普通的队列,同时又包含了优先队列priority_queue二.初始化格式定义:priority_queue<Type, Container, Functional>Type 就是数据类型,Container 就是容器类型(Container必须是用数组实现的容器,比如vector,deque等等,但不能用 list。STL里面默原创 2021-12-29 22:10:36 · 792 阅读 · 0 评论 -
二叉搜索树的删除
题目描述给定一个二叉搜索树的根节点 root 和一个值 key,删除二叉搜索树中的key对应的节点,并保证二叉搜索树的性质不变。返回二叉搜索树(有可能被更新)的根节点的引用。一般来说,删除节点可分为两个步骤:首先找到需要删除的节点;如果找到了,删除它。示例 1:输入:root = [5,3,6,2,4,null,7], key = 3输出:[5,4,6,2,null,null,7]解释:给定需要删除的节点值是 3,所以我们首先找到 3 这个节点,然后删除它。一个正确的答案...原创 2021-12-27 16:20:35 · 913 阅读 · 0 评论 -
LeetCode160相交链表
题目描述给你两个单链表的头节点headA 和 headB ,请你找出并返回两个单链表相交的起始节点。如果两个链表不存在相交节点,返回 null 。图示两个链表在节点 c1 开始相交:题目数据 保证 整个链式结构中不存在环。注意,函数返回结果后,链表必须 保持其原始结构 。自定义评测:评测系统 的输入如下(你设计的程序 不适用 此输入):intersectVal - 相交的起始节点的值。如果不存在相交节点,这一值为 0listA - 第一个链表listB - 第二个链表sk.原创 2021-12-01 10:43:13 · 242 阅读 · 0 评论 -
单词规律LeetCode290
题目描述思路看到这道题目下意识想到了hash_map,因为这种一一对应关系不就是hash_map的特长吗?1)我一开始只想到了从patttern到str的映射,先将str使用模拟进行单词分割存储在vec<string>数组中间.2)但是却忽略了eg:pattern="abba" str="dog dog dog dog dog"这样的情况,这要求我们不仅要建立从pattern到str的映射,还需要建立从str到pattern的映射!也就是说,要建立两次hash_map...原创 2021-11-30 14:38:52 · 892 阅读 · 0 评论 -
LeetCode43字符串相乘
目录题目描述思路:普通竖式优化竖式优化代码题目描述思路:一开始我想要使用atoi()和to_string()两个函数(分别来自cstdlib和sstream库),但是最后的结果超过了long的限制.所以我就没法了,想着,硬着头皮模拟一遍好了.普通竖式思路比较简单,我们写两个函数.一个函数负责返回两个string相加的结果,另一个函数负责模拟每一行相乘的结果.先算出相乘的结果,再拿结果和之前算出的res进行字符串相加函数操作.中间有一些细节问题要注意:...原创 2021-11-30 12:35:18 · 933 阅读 · 0 评论 -
字符串相加LeetCode187
目录题目描述:思路代码题目描述:415. 字符串相加难度简单472给定两个字符串形式的非负整数num1和num2,计算它们的和并同样以字符串形式返回。你不能使用任何內建的用于处理大整数的库(比如BigInteger),也不能直接将输入的字符串转换为整数形式。示例 1:输入:num1 = "11", num2 = "123"输出:"134"示例 2:输入:num1 = "456", num2 = "77"输出:"533"示例 3...原创 2021-11-28 11:19:22 · 423 阅读 · 0 评论 -
LeetCode142环形链表二
题目描述:142. 环形链表 II难度中等1266给定一个链表,返回链表开始入环的第一个节点。如果链表无环,则返回null。如果链表中有某个节点,可以通过连续跟踪next指针再次到达,则链表中存在环。 为了表示给定链表中的环,评测系统内部使用整数pos来表示链表尾连接到链表中的位置(索引从 0 开始)。如果pos是-1,则在该链表中没有环。注意:pos不作为参数进行传递,仅仅是为了标识链表的实际情况。不允许修改链表。示例 1:输入:head = [...原创 2021-11-28 10:33:03 · 112 阅读 · 0 评论 -
和为K的子数组LeetCode560
目录题目描述思路思路一--滑动窗口思路二--暴力求解思路三--前缀和+hash优化补充题目描述思路思路一--滑动窗口本来看到题目想着,我的天啊,这不是可以用滑动窗口完美解决吗?直到我看到数据可以为负数,我才开始意识到问题的严重性,最后想着使用动态规划,但是推导了半天硬是推导不出来表达式,无奈选择了暴力求解...思路二--暴力求解思路还是滑动窗口,但是这回遍历时右指针right一直要从左往右遍历到尽头才行,结果也不用说了,超时.........原创 2021-11-23 19:54:30 · 275 阅读 · 0 评论 -
LeetCode334递增的三元子序列,贪心+双指针
目录题目描述:思路代码题目描述:思路很自然能够想到使用两个数值来记录最小值和次小值,并且有一个前提--次小值>最小值,那么我们在后面的遍历过程中只要找到一个值大于次小值,结果返回true,如果遍历整个数组都没有找到,结果返回false.我们假设最小值small,次小值mid但是我们对于最小值和次小值的更新策略是什么呢?比如:small>=nums[i],我们就能够直接更新small呢???关键在这里---因为nums<=small,所以更新后得.原创 2021-11-23 11:39:13 · 435 阅读 · 0 评论 -
搜索二维数组LettCode240
题目地址:https://leetcode-cn.com/problems/search-a-2d-matrix-ii/思路一遍遍历在这里出现了很有趣的现象:我们都知道根据程序局部性原理来讲,按照先行再列的遍历速度肯定是要比先列后行的遍历顺序的速度要快得多的.那么我们如何书写才能在最快时间内遍历二维数组呢?使用下标访问吗?还是使用迭代器来访问?或者应该怎么写?但是标答中给出的遍历方式吸引了我的注意.....操作class Solution {public: ...原创 2021-11-22 17:28:28 · 579 阅读 · 0 评论 -
Line 1034: Char 9: runtime error: reference binding to null pointer of type ‘int‘ (stl_vector.h)
题目链接今天在刷LeetCode时出现了意外.....结果最后出现了意外:开头处.经过一番调试,我发现是在使用函数库提供的sort()函数时,配置cmp函数出现了意外:但是随后我们将等号去掉:其实在代码处理中不用管intervals[i][1],我们只需要对第一个元素值进行排序即可.所以千万要注意:cmp函数里面千万千万不要写等号,不然就是会报错!!!!!!#include<vector>#include<algorithm>...原创 2021-11-20 16:33:36 · 4662 阅读 · 2 评论 -
三数之和LeetCode15
题目描述思路我们如果是乱序的数组,如何集合去重?很困难!所以我们先想排序,再进行接下来的操作.如果使用for三重循环,肯定是会超时的.考虑固定第一个指针,第二个指针在第一个指针右边,不断变大,为了最后的a+b+c=0(此时的a是固定的数值),随着b的变大,c一定是会变小的,也就是说,b和c的选择就不是先选择b,再选择c的,我们可以同时选择!令b=a+1(指针意义上的加一!),c=nums[size-1],那么大体思路上就已经解决了.细节问题对于-1,-1,-1,0,1,2,4..原创 2021-11-19 19:44:26 · 892 阅读 · 0 评论 -
前序递归建立二叉树
目录前言思路代码前言上午在写二叉搜索树的最近公共祖先时,很尴尬,发现手写不出来递归建立二叉树的版本,不禁开始怀疑自己到底会不会二叉树,连最基本的建立都不会.....(趁着没人发现赶紧补习一波!!!冲冲冲!)思路其实递归建立二叉树和递归遍历二叉树思路基本是一样的,无非是将原来的"读出数据" 改成"创建节点并为节点赋值",后面都是一样的递归.我们可以使用一个标志位'@'来表示nullptr.代码TreeNode* CreateBiTree(){ ch...原创 2021-11-15 14:29:28 · 5251 阅读 · 0 评论 -
二叉搜索树最近的公共祖先
题目描述之前做过一道类似的题目(简单来说就是原题.)题目说就是给定一个二叉树,搜索公共祖先,思路也是一次遍历,使用数组存储从根节点到目标节点的路径,再根据两条路径来确定最近公共祖先.坎坷本来使用两个指针依次遍历两个vector<TreeNode*>数组,自己在VS上运行时一点问题都没有,等到在LeetCode上跑起来的时候,只想骂人.缝缝补补了半天,终于还是决定看题解.题解优化:使用一个TreeNode*节点,当两个vector<TreeNode*&...原创 2021-11-15 14:08:38 · 1268 阅读 · 0 评论 -
对称二叉树LeetCode101两种解法
目录题目描述:递归递归代码迭代迭代代码题目描述:思考:考虑对称,很明显,我们需要两个指针,对称指向相应位置,如果不对称或者数值不对,返回false!下面介绍两种解法:递归解法和迭代解法:递归递归三部曲:1)返回条件2)递归条件3)返回值本题已经确定了返回值,我们首先要确定root是否为空,但是这如果直接写在递归函数里很明显是不划算的,所以我们单独写一个函数判断初始root是否为null.那么递归条件怎么想呢?我们考虑以下情...原创 2021-11-14 15:14:52 · 722 阅读 · 0 评论 -
Line 9: Char 25: warning: ‘memset‘ call operates on objects of type ‘int‘ while the size is based on
使用memset函数时出现了BUG.void setZeroes(vector<vector<int> >& matrix) { int size1 = matrix.size(); int size2 = matrix[0].size(); int* hang = new int[size1]; int* lie = new int[size2]; memset(hang, 0, sizeof(hang)); //这里的因为初始化不是vector容器原创 2021-11-09 11:37:51 · 1131 阅读 · 0 评论 -
有效的数独LeetCode36
#include<vector>#include<iostream>#include<cstring> //cao,string!初始化字符 using namespace std;/** 使用hash映射:* hang[i][j] 表示第i行出现数字j的次数* lie[i][j] 表示第i列出现数字j的次数* san[i][j][k]表示3*3的单元格中出现数值k的次数,一次遍历*/bool isValidSudoku(vector&.原创 2021-11-08 11:43:04 · 93 阅读 · 0 评论 -
两个数组的交集
思路很简单1)排序,双指针static bool cmp(int a, int b){ return a < b;}vector<int> intersect(vector<int>& nums1, vector<int>& nums2) { int i = 0; int j = 0; vector<int> res; sort(nums1.begin(), nums1.end(), cmp);...原创 2021-11-07 17:24:18 · 223 阅读 · 0 评论 -
买卖股票的时机LeetCode121
暴力求解结果...很明显,这是最简单的暴力,那么我们有没有什么办法来减减枝?eg:1,2,3,7,2,5,10我们可以发现---我们不需要山坡的上的元素,我们真正需要的是顶点的元素!于是我们可以新建一个vec数组,里面存放的都是拐角的元素(7,2,10),以及起点元素(1,10),这样就可以降低一定的时间复杂度.思路简单,代码如下://思路一-暴力+剪枝int maxProfit(vector<int>& prices) { vector<in...原创 2021-11-07 15:57:32 · 103 阅读 · 0 评论 -
Q2-合并两个有序数组LeetCode88
88. 合并两个有序数组难度简单1167给你两个按非递减顺序排列的整数数组nums1和nums2,另有两个整数m和n,分别表示nums1和nums2中的元素数目。请你合并nums2到nums1中,使合并后的数组同样按非递减顺序排列。注意:最终,合并后数组不应由函数返回,而是存储在数组nums1中。为了应对这种情况,nums1的初始长度为m + n,其中前m个元素表示应合并的元素,后n个元素为0,应忽略。nums2的长度为n。...原创 2021-11-05 15:13:17 · 112 阅读 · 0 评论 -
LeetCodeQ1-两数之和
在一上午摸索无果之后果断选择来看一手题解,结果因为题解中的unordered_map之前没接触过,先去看了网上的一些文章.首先罗列一下map,unordered_map,set,unordered_set的区别和联系:map底层是红黑树,插入删除,查询操作时间复杂度都是O(logn)unordered_map底层是hash表,查询的时间复杂度为O(1),效率比map高,但是空间复杂度也比map高.set,unordered_set类似于上面的map和unordered_map...原创 2021-11-05 14:21:27 · 134 阅读 · 0 评论 -
Q2-最大子序和-LeetCode53
思路:贪心算法,每次碰到当前元素sum<0,直接更新sum的值,之前的值全部抛弃,但是问题是如果所有的输入都是负数,该怎么处理呢?int maxSubArray(vector<int>& nums) { int sum = 0; int max_ = 0; int minus = INT_MIN; bool flag = true; //默认只有负数 for (int i : nums) { if (i < 0&& flag) {..原创 2021-11-04 15:38:05 · 107 阅读 · 0 评论 -
存在重复元素LeetCode217
Q1.存在重复元素给定一个整数数组,判断是否存在重复元素。如果存在一值在数组中出现至少两次,函数返回 true 。如果数组中每个元素都不相同,则返回 false 。示例 1:输入: [1,2,3,1]输出: true示例 2:输入: [1,2,3,4]输出: false示例3:输入: [1,1,1,3,3,4,3,2,4,2]输出: true我的解法:#include<iostream>#include<vector>#inclu.原创 2021-11-04 15:08:07 · 117 阅读 · 0 评论