力扣刷题
刘心芝士小蛋糕
一个会敲代码的甜妹
展开
-
力扣剑指offer31天刷题计划---day1 栈与队列
剑指 Offer 09. 用两个栈实现队列用两个栈实现一个队列。队列的声明如下,请实现它的两个函数 appendTail 和 deleteHead ,分别完成在队列尾部插入整数和在队列头部删除整数的功能。(若队列中没有元素,deleteHead 操作返回 -1 )/*解题思路:AB两栈:A实现入队功能,B实现出队功能入队:加入栈A中即可出队: - 栈B为空时,栈A也为空,返回-1 - 栈B为空,A不为空时,执行倒序,将a中的元素倒叙给b,删除b的栈顶元素即可 - 栈B不为原创 2022-03-29 15:38:58 · 208 阅读 · 0 评论 -
力扣14天 [算法] 刷题:第2、3、4、5天(双指针)
第二天977. 有序数组的平方class Solution {public: vector<int> sortedSquares(vector<int>& nums) { // //方法一:先平方再排序 // vector<int> ans; // for(int num : nums) { // ans.push_back(num * num); // }.原创 2022-02-11 11:04:43 · 298 阅读 · 0 评论 -
力扣14天 [算法] 刷题:第1天(二分查找)
704.二分查找class Solution {public: int search(vector<int>& nums, int target) { //遍历数组 // for(int i = 0; i < nums.size(); i++){ // if(nums[i] == target){ // return i; // } // }原创 2022-02-10 14:06:22 · 291 阅读 · 0 评论 -
力扣刷题75:颜色分类C++
解题思路1.两个指针:头和尾--->p0和p22.遇到0,跟p0进行交换,p0和i都往前+1走,p0之前肯定是保证顺序正确3.遇到2,跟p2进行交换,p2往回-1走,i停一轮是为了检测当前被换过来的数字,直到i和p2相遇,说明结束了代码class Solution {public: void sortColors(vector<int>& nums) { int n = nums.size(); int p0 = 0,p2 =原创 2021-09-15 20:03:32 · 201 阅读 · 3 评论 -
力扣刷题179:最大数C++
解题思路1.排序2.不相同数字开头的,依次比较高位3.相同数字开头的,比较两个数不同排列后的大小代码class Solution {public: string largestNumber(vector<int>& nums) { //自己定义的排序 sy * x + y > sx * y + x sort(nums.begin(),nums.end(),[](const int &x,const int &y){原创 2021-09-13 20:03:53 · 146 阅读 · 0 评论 -
力扣刷题56:合并区间C++
解题思路用一个二维数组存储最终答案1.如果当前区间的左端点小于最后一个区间的右端点,则表示有重合部分, 比较两个区间的右端点,将右端点置为二者间的最大值2.如果当前区间的左端点大于最后一个区间的右端点, 则表示没有重合部分,直接将区间加入二位存储数组中代码class Solution {public: vector<vector<int>> merge(vector<vector<int>>& intervals) {原创 2021-09-06 10:09:01 · 197 阅读 · 0 评论 -
力扣刷题299:猜数字游戏C++
解题思路两次遍历统计两种情况:1.A---数字对位置对 公牛2.B---数字对了但位置不对的个数=数字对-数字对且位置对 奶牛第一种比较好统计,只要对比位置上的字符就好第二种把遍历第一个字符串中的字符与出现的次数存放在哈希表中,然后再遍历另一个字符串,每遍历一个字符在哈希表中寻找如果找得到就对这个字符所对应的次数减一,然后再把统计数字加一代码class Solution {public: string getHint(string secret, string gue原创 2021-08-25 10:02:35 · 327 阅读 · 0 评论 -
力扣刷题380:O(1) 时间插入、删除和获取随机元素C++
解题思路利用动态数组的下标索引实现常数时间内的插入和随机元素的访问,再利用哈希表实现常数时间的删除操作:将删除元素和最后一个元素交换,将最后一个元素删除代码class RandomizedSet {private: unordered_map<int,int> hash;//哈希实现删除 vector<int> v;//动态数组实现插入和随机访问public: /** Initialize your data structure here. */原创 2021-08-17 11:21:08 · 171 阅读 · 0 评论 -
力扣刷题73:矩阵置零C++
解题思路原地算法:输出结果覆盖输入结果,不额外开辟内存和空间具体步骤:1.使用两个标记量记录首行首列是否需要置零2.扫描非首行首列的置零信息3.回过头来将根据标记量将首行首列是否置零代码class Solution {public: void setZeroes(vector<vector<int>>& matrix) { int m = matrix.size();//行 int n = matrix[0].size原创 2021-08-16 16:28:01 · 145 阅读 · 0 评论 -
力扣刷题128:最长连续序列C++
解题思路要求时间复杂度为 O(n),所以不能用sort如果有一个x, x+1, x+2, x+y的连续序列,我们只会以x为起点向后枚举,而不会从x+1,x+2,向后枚举。因此判断x-1存在即可。1.定义一个哈希表hash,将nums数组中的数都放入哈希表中。2.遍历哈希表hash,如果当前数x的前驱x-1不存在,我们就以当前数x为起点向后枚举。3.枚举到了数y,连续序列长度为y-x+1。4.更新答案。代码class Solution {public: int longestC原创 2021-08-16 15:19:31 · 152 阅读 · 0 评论 -
力扣刷题1:两数之和C++
解题思路两边遍历,返回数组下标代码class Solution {public: vector<int> twoSum(vector<int>& nums, int target) { for(int i = 0;i < nums.size();i++){//从第一个元素开始遍历 for(int j = i + 1; j < nums.size();j++){//从第二个元素开始遍历第二遍原创 2021-08-16 14:12:23 · 144 阅读 · 0 评论 -
力扣刷题146:LRU 缓存机制C++
解题思路双链表+哈希:双链表存储一个节点被使用(get或者put)的时间戳,且按最近使用时间从左到右排好序,最先被 使用的节点放在双链表的第一位,因此双链表的最后一位就是最久未被使用的节点哈希表存储key对应的链表中的节点地址,用于key-value 的增删改查;双链表和哈希表的增删改查操作的时间复杂度都是 O(1),所以get和put操作的时间复杂度也都是O(1)代码class LRUCache {public: //定义双链表 struct Node{原创 2021-08-16 13:58:14 · 151 阅读 · 0 评论 -
力扣刷题350:两个数组的交集 IIC++
解题思路1.哈希表存储这个数字出现的次数2.遍历第一个数组,哈希表记录每个数字和他出现的次数3.遍历第二个数组,如果哈希表中存在这个数字,把这个数字记录在答案中,并减少哈希表中该数字出现的次数4.为了降低空间复杂度,先遍历短的数组count()方法返回值是一个整数,1表示有这个元素,0表示没有这个元素代码class Solution {public: vector<int> intersect(vector<int>& nums1, vector&原创 2021-08-13 20:01:21 · 135 阅读 · 0 评论 -
力扣刷题1209:删除字符串中的所有相邻重复项 IIC++
解题思路用一个栈来计数,数字不同时,栈中压1,相同时给栈顶元素加1代码class Solution {public: string removeDuplicates(string s, int k) { stack<int> count;//计数栈 for(int i = 0;i < s.size();i++){//遍历字符串 if(i == 0|| s[i] != s[i - 1]){//第一个值没办法和前值判断,原创 2021-08-13 17:23:44 · 245 阅读 · 0 评论 -
力扣刷题735:行星碰撞C++
解题思路1.正右左负2.使用整数数组,左正右负才会发生碰撞碰撞分三种情况: 容器尾的值大于要进入数值的绝对值时,表示为新值=0;新行星被老行星吸收了 容器尾的值等于要进入数值的绝对值时,表示为弹出尾部的值,新值=0;两个行星抵消了 容器尾的值小于要进入数值的绝对值时,表示为弹出尾部的值,保存新值; 新行星把老行星吃掉了代码class Solution {public: vector<int> asteroidCollision(vector<int>原创 2021-08-13 16:54:42 · 292 阅读 · 0 评论 -
力扣刷题227:C++基本计算器 II
解题思路1.使用容器,保存符号运算后的数值,2.加减号直接存入3.乘除号与尾部元素计算后将其替换代码class Solution {public: int calculate(string s) { vector<int> v;//容器v来存储符号后的数值 char preSign = '+';//变量 preSign 记录每个数字之前的运算符,对于第一个数字,其之前的运算符视为加号 int num = 0;// 保存当前数字原创 2021-08-13 15:41:12 · 180 阅读 · 0 评论 -
力扣刷题150:逆波兰表达式求值C++
解题思路逆波兰表达式:1.需要一个栈存储操作数,遇到操作数把它入栈2.遇到操作符,把数出栈,右操作数先出,左操作数后出,运算后再入栈atoi()函数的功能:将字符串转换成整型数;atoi()会扫描参数nptr字符串,跳过前面的空格字符,直到遇上数字或正负号才开始做转换,而再遇到非数字或字符串时(’\0’)才结束转化,并将结果返回(返回转换后的整型数)。c_str():Borland封装的String类中的一个函数,它返回当前字符串的首字符地址代码class Solution {pub原创 2021-08-13 13:53:08 · 194 阅读 · 0 评论 -
力扣刷题54:螺旋矩阵C++
解题思路1.确定上下左右四条边,初始化时:上边界是0,下边界是m-1,左边界是0,右边界是n-12.while循环,先遍历上边界,结果存入,上边界大于下边界跳出循环3.遍历其余三个方向,道理同上代码class Solution {public: vector<int> spiralOrder(vector<vector<int>>& matrix) { if(matrix.empty() || matrix[0].empty原创 2021-08-13 09:33:35 · 200 阅读 · 0 评论 -
力扣刷题33:二分查找 搜索旋转排序数组C++
解题思路局部有序,同样可以使用二分查找将数组一分为二,其中一定有一个是有序的,另一个可能是有序,也能是部分有序。此时有序部分用二分法查找。无序部分再一分为二,其中一个一定有序,另一个可能有序,可能无序。就这样循环。具体思路:1.找一个中值mid把数组分成[left,mid][mid+1,right]两部分,肯定有一部分是有序的;2.如果左边是有序的,目标值小于等于num[0]且小于中值时,说明目标值在这段有序数内,右边界 为mid - 1,否则在另一端left = mid + 13.如原创 2021-08-12 17:27:07 · 151 阅读 · 0 评论 -
力扣刷题35:二分查找 搜索插入位置C++
解题思路要求时间复杂度为O(logn),空间复杂度为O(1),明显是二分查找1.二分查找2.找中值,进行左右判断代码class Solution {public: int searchInsert(vector<int>& nums, int target) { int len = nums.size();//数组大小 int left = 0;//数组左边界 int right = len - 1;//数组右边界原创 2021-08-12 15:25:38 · 93 阅读 · 0 评论 -
力扣刷题2:两数相加C++
解题思路1.定义一个预先指针,指针的下一个结点指向头节点;2.需要考虑到进位3.全部遍历完后,进位值为1,在新链表最前方添加结点1代码/** * Definition for singly-linked list. * struct ListNode { * int val; * ListNode *next; * ListNode() : val(0), next(nullptr) {} * ListNode(int x) : val(x), next原创 2021-08-12 14:46:57 · 154 阅读 · 0 评论 -
力扣刷题1472:设计浏览器历史记录C++
解题思路:1.数组只用来做存储2.给栈定义一个访问指针3.通过访问指针进行快速跳转和数据删除代码:class BrowserHistory {public: int pos = -1;//定义访问栈的指针 int top = 0;//定义栈顶 string history[5001];//定义大小为5001的一维数组 BrowserHistory(string homepage){//用主页初始化浏览器 visit(homepage);//可以原创 2021-08-12 13:51:01 · 265 阅读 · 0 评论 -
力扣刷题148:归并对链表排序c++
解题思路:1.先分割:寻找链表中点,将链表分成两个子链表,中点用快慢指针找,慢指针走一步,快指针走两步,慢指针到中点时,快指针到末尾,2.再合并对列表排序,合并两个排好序的列表代码/** * Definition for singly-linked list. * struct ListNode { * int val; * ListNode *next; * ListNode() : val(0), next(nullptr) {} * List原创 2021-08-11 16:22:43 · 99 阅读 · 0 评论 -
力扣刷题743:最短路径求网络延迟时间c++
解题思路核心思路还是贪心算法,先求局部最优,源点到第一个节点的最短路径,依次求下一个节点的最短路径1.用二维数组遍历存储邻接结点边信息2.定义结点到源点的距离数组3.从源点出发第一遍遍历找源点的第一个最近节点4.找到一个节点后找这个节点的下一个最近节点class Solution {public: int networkDelayTime(vector<vector<int>>& times, int n, int k) { con原创 2021-08-10 20:06:57 · 223 阅读 · 0 评论 -
力扣刷题455:排序加贪心:分饼干c++
解题思路:目标是让尽可能多的孩子吃饱,那就用最小的饼干先让饭量最小的孩子吃贪心算法:不从整体考虑,求得局部最优解class Solution {public: int findContentChildren(vector<int>& g, vector<int>& s) { //目标是让尽可能多的孩子吃饱,那就用最小的饼干先让饭量最小的孩子吃 //g[i]:小孩数组 s[i]:饼干数组 从第一个孩子开始,保证吃饱原创 2021-08-10 17:32:26 · 164 阅读 · 0 评论 -
力扣刷题225:双队列实现一个栈
解题思路两给队列实现一个栈, 一个作为主队列,一个作为辅助队列保证辅助队列是空队列class MyStack { /* 栈是一种后进先出的数据结构,元素从顶端入栈,然后从顶端出栈。 队列是一种先进先出的数据结构,元素从后端入队,然后从前端出队。 */public: //两给队列实现一个栈,定义两个队列 queue<int> queue1; queue<int> queue2; /** Initialize y原创 2021-08-10 17:05:53 · 143 阅读 · 0 评论 -
力扣刷题102:二叉树的层序遍历
题目描述:给你一个二叉树,请你返回其按 层序遍历 得到的节点值。 (即逐层地,从左到右访问所有节点)。示例:二叉树:[3,9,20,null,null,15,7], 3 / \ 9 20 / \ 15 7返回其层序遍历结果:[ [3], [9,20], [15,7]]/** * Definition for a binary tree node. * struct TreeNode { * int val; node原创 2021-08-09 19:57:30 · 110 阅读 · 0 评论