![](https://img-blog.csdnimg.cn/20201014180756928.png?x-oss-process=image/resize,m_fixed,h_64,w_64)
leetcode刷题
虽迟但到灬
一起快乐的努力
展开
-
leetcode刷题:火柴拼正方形
题目:分析:基本思路,在数组中搜索是否有和为sum/4的子序列,一共搜索四次,每次要把用过的标记考虑[1,1,2,2,3,3,4], 如果先将[1,1,2]组合,那么后面的就不能组合成4了。针对这种情况,我们应该由大到小搜索,因为小的数值总是可以拼凑。所以需要先对数组进行逆序排序。然后从前往后依次搜索。代码如下:class Solution {public: bool makesquare(vector<int>& nums) { int原创 2022-02-12 21:18:47 · 200 阅读 · 0 评论 -
leetcode刷题:不同路径II
分析:我们用 f(i, j)f(i,j) 来表示从坐标 (0, 0)(0,0) 到坐标 (i, j)(i,j) 的路径总数,u(i, j)u(i,j) 表示坐标 (i, j)(i,j) 是否可行,如果坐标 (i, j)(i,j) 有障碍物,u(i, j) = 0u(i,j)=0,否则 u(i, j) = 1u(i,j)=1。因为「机器人每次只能向下或者向右移动一步」,所以从坐标 (0, 0)(0,0) 到坐标 (i, j)(i,j) 的路径总数的值只取决于从坐标 (0, 0)(0,0) 到坐标 (i .原创 2022-02-11 22:53:09 · 110 阅读 · 0 评论 -
leetcode刷题:合并区间
题目:分析:通过双指针,遍历代码如下:class Solution{public: vector<vector<int>> merge(vector<vector<int>> &intervals) { // 去除脏数据 无序排序 if (intervals.size() == 0) { return {}; } //原创 2022-02-10 14:08:49 · 404 阅读 · 0 评论 -
leetcode刷题:循环队列
题目:分析:这里使用数组进行模拟循环队列插入和删除数据的过程;使用头指针head和尾指针tail进行维护还存有的一段的连续数据;记录当前存有的数据的个数来判断是否填满队列;代码如下:class MyCircularQueue {private: int cur; int maxi; int head; int tail; vector<int>circulque;public: MyCircularQueue(int k) {原创 2022-02-09 21:13:42 · 234 阅读 · 0 评论 -
leetcode刷题:删除链表中的节点
题目:分析:删除链表中的节点的常见的方法是定位到待删除节点的上一个节点,修改上一个节点的 \textit{next}next 指针,使其指向待删除节点的下一个节点,即可完成删除操作。这道题中,传入的参数 \textit{node}node 为要被删除的节点,无法定位到该节点的上一个节点。注意到要被删除的节点不是链表的末尾节点,因此 \textit{node}.\textit{next}node.next 不为空,可以通过对 \textit{node}node 和 \textit{node}.\tex原创 2022-02-09 18:25:16 · 129 阅读 · 0 评论 -
leetcode刷题:相交链表
题目:分析:判断两个链表是否相交,可以使用哈希集合存储链表节点。首先遍历链表 \textit{headA}headA,并将链表 \textit{headA}headA 中的每个节点加入哈希集合中。然后遍历链表 \textit{headB}headB,对于遍历到的每个节点,判断该节点是否在哈希集合中:如果当前节点不在哈希集合中,则继续遍历下一个节点;如果当前节点在哈希集合中,则后面的节点都在哈希集合中,即从当前节点开始的所有节点都在两个链表的相交部分,因此在链表 \textit{headB}hea原创 2022-02-08 21:30:15 · 70 阅读 · 0 评论 -
leetcode刷题:LRU缓存淘汰算法
题目:分析:计算机的缓存容量有限,如果缓存满了就要删除一些内容,给新内容腾位置。但问题是,删除哪些内容呢?我们肯定希望删掉哪些没什么用的缓存,而把有用的数据继续留在缓存里,方便之后继续使用。那么,什么样的数据,我们判定为「有用的」的数据呢?LRU 缓存淘汰算法就是一种常用策略。LRU 的全称是 Least Recently Used,也就是说我们认为最近使用过的数据应该是是「有用的」,很久都没用过的数据应该是无用的,内存满了就优先删那些很久没用过的数据。LRU 缓存机制可以通过哈希表辅以双向链表实原创 2022-02-08 17:37:53 · 533 阅读 · 0 评论 -
leetcode刷题:数组中第K个最大的元素
题目:分析:我们只需将这个数组进行排序,从小到大排序,然后获取第k大的数字即可,代码如下:class Solution {public: int findKthLargest(vector<int>& nums, int k) { if(k>nums.size()) return 0; sort(nums.begin(),nums.end()); return nums[nums.size()原创 2022-02-08 16:50:27 · 180 阅读 · 0 评论 -
leetcode刷题:
题目:分析:我们考虑枚举数组中的每个数 xx,考虑以其为起点,不断尝试匹配 x+1, x+2, \cdotsx+1,x+2,⋯ 是否存在,假设最长匹配到了 x+yx+y,那么以 xx 为起点的最长连续序列即为 x, x+1, x+2, \cdots, x+yx,x+1,x+2,⋯,x+y,其长度为 y+1y+1,我们不断枚举并更新答案即可。对于匹配的过程,暴力的方法是 O(n)O(n) 遍历数组去看是否存在这个数,但其实更高效的方法是用一个哈希表存储数组中的数,这样查看一个数是否存在即能优化至 O(原创 2022-01-30 22:26:51 · 50 阅读 · 0 评论 -
leetcode刷题:二叉树的中序遍历
题目:分析:代码如下: vector<int> postorderTraversal(TreeNode* root) { stack<TreeNode*> S; vector<int> v; TreeNode* rt = root; while(rt || S.size()){ while(rt){ S.push(rt->left)原创 2022-01-28 22:50:23 · 4523 阅读 · 0 评论 -
leetcode刷题:反转链表II
题目:分析:可以用使用双指针+头插法1、我们定义两个指针,分别称之为 g(guard 守卫) 和 p(point)。我们首先根据方法的参数 m 确定 g 和 p 的位置。将 g 移动到第一个要反转的节点的前面,将 p 移动到第一个要反转的节点的位置上。我们以 m=2,n=4为例。2、将 p 后面的元素删除,然后添加到 g 的后面。也即头插法。3、根据 m 和 n 重复步骤(2)4、返回 dummyHead.nextclass Solution {public: ListNode原创 2022-01-27 16:34:51 · 88 阅读 · 0 评论 -
leetcode刷题:反转链表I
1.题目分析:代码如下://迭代反转法,head 为无头节点链表的头指针link * iteration_reverse(link* head) { if (head == NULL || head->next == NULL) { return head; } else { link * beg = NULL; link * mid = head; link * end = head->ne原创 2022-01-27 15:58:09 · 494 阅读 · 0 评论 -
leetcode刷题:不同路径
题目:分析:因为题目要求只能向右和向下走动一格。经过分析可得如下代码从左上角到右下角的过程中,我们需要移动 m+n-2m+n−2 次,其中有 m-1m−1 次向下移动,n-1n−1 次向右移动。因此路径的总数,就等于从 m+n-2m+n−2 次移动中选择 m-1m−1 次向下移动的方案数,即组合数:class Solution {public: int uniquePaths(int m, int n) { long long ans = 1; for (原创 2022-01-25 17:45:24 · 135 阅读 · 0 评论 -
leetcode刷题:合并两个有序链表
题目:分析思路:1.新建一个哨兵结点,到时用于返回合并后新链表的头结点。2.while循环,直到有一点链表到结尾为止3.把非空的链表绑定到合并结点的尾部,并返回合并后链表的头结点。代码如下:class Solution {public: ListNode* mergeTwoLists(ListNode* list1, ListNode* list2) { ListNode *prehead = new ListNode(-1); ListNode *p原创 2022-01-25 14:25:04 · 259 阅读 · 0 评论 -
leetcode刷题:删除链表的倒数第 N 个结点
题目:采取双重遍历肯定是可以解决问题的,但题目要求我们一次遍历解决问题,那我们的思路得发散一下。我们可以设想假设设定了双指针 p 和 q 的话,当 q 指向末尾的 NULL,p 与 q 之间相隔的元素个数为 n 时,那么删除掉 p 的下一个指针就完成了要求。设置虚拟节点 dummyHead 指向 head设定双指针 p 和 q,初始都指向虚拟节点 dummyHead移动 q,直到 p 与 q 之间相隔的元素个数为 n同时移动 p 与 q,直到 q 指向的为 NULL将 p 的下一个节点指向下原创 2022-01-23 00:05:44 · 559 阅读 · 0 评论 -
leetcode刷题:无重复字符的最长子串
题目:分析:取巧解法,通过setclass Solution {public: int lengthOfLongestSubstring(string s) { if(s.size() == 0) return 0; set<char> lookup; int maxStr = 0; int left = 0; for(int i = 0; i < s.size();原创 2022-01-21 11:18:44 · 118 阅读 · 0 评论 -
leetcode刷题:零钱兑换
题目:分析:背包问题:背包问题是动态规划非常重要的一类问题,它有很多变种,但题目千变万化都离不开我根据力扣上背包问题的题解和一些大佬的经验总结的解题模板背包定义:那么什么样的问题可以被称作为背包问题?换言之,我们拿到题目如何透过题目的不同包装形式看到里面背包问题的不变内核呢?我对背包问题定义的理解:给定一个背包容量target,再给定一个数组nums(物品),能否按一定方式选取nums中的元素得到target注意:1、背包容量target和物品nums的类型可能是数,也可能是字符串2、原创 2022-01-20 18:51:33 · 64 阅读 · 0 评论 -
leetcode刷题:爬楼梯
题目:分析:通过分析得知,当台阶只有两层时,方式是两种。当台阶是1层时,方法有一中,三层时方法有三种。所以台阶每加一层(当为n层时),那么就方法就会变成爬n-2层和n-1层的方法数之和。代码如下:int climbStairs(int n) { if(n==1) return 1; if(n == 2) return 2; if(n > 2) {原创 2022-01-19 23:50:27 · 3417 阅读 · 0 评论 -
leetcode刷题:z字形变换
题目:图解思路实现代码如下:class Solution {public: string convert(string s, int numRows) { if(numRows < 2) return s; vector<string> rows; for(int i = 0;i <numRows;i++) { rows.push_back("");原创 2022-01-17 23:16:24 · 3905 阅读 · 0 评论 -
leetcode刷题:求容器中能乘最大多少水
题目:分析:此题目中可以很容易想到双指针的解法,就是从两边依次开始进行宽和高的定量。没算出一个结果,存到一个新的数组中,求出这个数组的最大值。注意:双指针的移位很重要,每个指针的移动条件需要注意。代码如下:class Solution {public: int maxArea(vector<int>& height) { int low = 0; int high = height.size()-1; vector<原创 2022-01-17 11:46:28 · 78 阅读 · 0 评论 -
leetcode刷题:三数之和
题目:分析:这是最容易想到的做法,但是有明显的问题,时间复杂度达到0(n3),并且没有去重。class Solution {public: vector<vector<int>> threeSum(vector<int>& nums) { int length = nums.size(); vector<vector<int>> resultV; for(i原创 2022-01-17 09:56:17 · 181 阅读 · 0 评论 -
leetcode刷题:搜索旋转排序数组
题目:分析:当我们将数组旋转的时候,就无法再保证数组是完全有序的了,但是我们可以判断出那块是有序的。然后在进行比较和查找如下代码:class Solution {public: int search(vector<int>& nums, int target) { int n = (int)nums.size(); if (!n) { return -1; } if (n == 1)原创 2022-01-16 21:25:52 · 231 阅读 · 0 评论 -
leetcode刷题:求旋转有序数组的最小值
题目:分析:由题中所给的描述,不管数组如何旋转,我们的整个数组,其实总是真正有序的适用于二分查找法。代码如下:#include <stdio.h>int findMin(int* nums, int numsSize) { int low = 0; int high = numsSize - 1; while (low < high) { int pivot = low + (high - low) / 2; if (num原创 2022-01-16 17:23:35 · 182 阅读 · 0 评论 -
leetcode刷题:最大子序积
1.题目题解:实现上面的过程class Solution {public: int maxProduct(vector<int>& nums) { int maxmium = nums[0]; for (auto v : nums) { if (maxmium < v) maxmium = v; } int imax = 1原创 2022-01-15 19:46:45 · 844 阅读 · 0 评论 -
leetcode刷题:数组的最大子序和
题目:动态规划: 分析:上面的图是老的数组,下面的是新的数组,通过老数组的当前值加上前一个值对应位置的新数组的值,就是新数组对应位置的新值,最后找到新的队列元素中的最大值即可。代码如下:#include <iostream>#include <vector>using namespace std;class Solution{public: int maxSubArray(vector<int>& nums) {原创 2022-01-14 21:08:09 · 154 阅读 · 0 评论 -
leetcode刷题:除自身以外数组的乘积
题干:分析:可以把新的数组的每个元素理解为原数组对应的位置的前缀之积和后缀之积。放在answer中的值,就是我们新的数组对应结果代码如下:class Solution {public: vector<int> productExceptSelf(vector<int>& nums) { int length = nums.size(); // L 和 R 分别表示左右两侧的乘积列表 vector<原创 2022-01-12 23:03:01 · 216 阅读 · 0 评论 -
leetcode刷题:121题stock
题目:给定一个数组 prices ,它的第 i 个元素 prices[i] 表示一支给定股票第 i 天的价格。你只能选择 某一天 买入这只股票,并选择在 未来的某一个不同的日子 卖出该股票。设计一个算法来计算你所能获取的最大利润。返回你可以从这笔交易中获取的最大利润。如果你不能获取任何利润,返回 0分析:暴力法:如下图:对于一个给定的股票每日价格数组,给出进行红圈黑线两次遍历。然后将其差值存入一个新的数组中,求出这个数组中的最大值。如下代码:#include <iostream>原创 2022-01-11 14:36:23 · 153 阅读 · 0 评论 -
leetcode刷题:2.两数之和
本篇博客介绍如何找到两数之和。获取相加的两个数获取最终target的方法。先看如下图:我们很容易想到暴力解法。即两次循环获取结果,第一次循环循环黑圈,我们先假定第一个黑圈中1,是我们要的数,然后接下来第二次循环遍历红线上的数,看看哪个数和黑圈中的1相加是我们想要的红线上的数。以此类推。如下代码:#include <iostream>#include <vector>using namespace std;class Solution {public: vec原创 2022-01-10 11:38:16 · 126 阅读 · 0 评论 -
leetcode刷题:1.无重复字符的最长字串
题目:方法一:首先我们可以想到暴力解法,就是·逐个生成字符串·看他受否含有重复字符如下代码暴力法:int LenOfUniqueStr(char* Start){ int Validity[128] = {0}; int Len = 0; char* ReadPos = Start; for (; *ReadPos != '\0' ; ReadPos ++) { int Index = *ReadPos; if (Valid原创 2022-01-03 21:55:23 · 95 阅读 · 0 评论