![](https://img-blog.csdnimg.cn/20201014180756925.png?x-oss-process=image/resize,m_fixed,h_64,w_64)
leetcode
记录leetcode题解
dengh57
这个作者很懒,什么都没留下…
展开
-
leetcode算法——二分查找
二分查找 单纯的二分查找系列 基本思路 就是单纯的二分查找,但要注意可能存在的变形情况 74. 搜索二维矩阵 https://leetcode-cn.com/problems/search-a-2d-matrix/ class Solution { public: bool searchMatrix(vector<vector<int>>& matrix, int target) { int m = matrix.size();原创 2022-03-02 14:33:06 · 403 阅读 · 0 评论 -
33. 搜索旋转排序数组
33. 搜索旋转排序数组 题目 搜索旋转排序数组 方法思路 二分法 先找到一段有序的(可能左边,可能右边,或者两边都有序) 然后判断target在不在这段有序数组范围之中 在其中,就二分该段数组 不在,就二分另一段数组 代码 class Solution { public: int search(vector<int>& nums, int target) { int ans = -1; int l = 0; int r = n原创 2021-09-19 10:37:58 · 39 阅读 · 0 评论 -
121. 买卖股票的最佳时机
121. 买卖股票的最佳时机 题目 买卖股票的最佳时机 方法思路 贪心 一直记录一个当前的最小价格,出现价格高的 记录此时卖出获得的利润,保存最大的利润 代码 class Solution { public: int maxProfit(vector<int>& prices) { int maxV = 0; int minPrice = prices[0]; for (int i = 1; i < prices.size原创 2021-09-19 09:33:54 · 40 阅读 · 0 评论 -
102. 二叉树的层序遍历
102. 二叉树的层序遍历 题目 二叉树的层序遍历题目 方法题解 迭代很常见,这里使用递归方法实现 记录下结点所在的层数即可 具体见代码 代码 /** * Definition for a binary tree node. * struct TreeNode { * int val; * TreeNode *left; * TreeNode *right; * TreeNode() : val(0), left(nullptr), right(nullptr原创 2021-09-19 09:26:03 · 51 阅读 · 0 评论 -
21. 合并两个有序链表
21. 合并两个有序链表 题目 合并两个有序链表题目 方法思路 递归或迭代 注意递归写法 代码 /** * Definition for singly-linked list. * struct ListNode { * int val; * ListNode *next; * ListNode() : val(0), next(nullptr) {} * ListNode(int x) : val(x), next(nullptr) {} * Li原创 2021-09-18 11:04:18 · 42 阅读 · 0 评论 -
53. 最大子序和
53. 最大子序和 题目 最大子序和题目 变式:返回数组(也就是需要记录最大子序的起始位置) 方法思路 贪心思想 记f(i)为以i位置元素结尾的最大子序和 那么f(i) = max{f(i - 1) + nums[i], nums[i]} 变式见代码 只需要记录子序和的位置 代码 class Solution { public: int maxSubArray(vector<int>& nums) { // sum记录以i - 1为结尾的最大子序和原创 2021-09-18 10:55:51 · 49 阅读 · 0 评论 -
141. 环形链表
141. 环形链表 题目 环形链表题目 方法思路 快慢指针 代码 /** * Definition for singly-linked list. * struct ListNode { * int val; * ListNode *next; * ListNode(int x) : val(x), next(NULL) {} * }; */ class Solution { public: bool hasCycle(ListNode *head) {原创 2021-09-18 10:15:59 · 48 阅读 · 0 评论 -
1. 两数之和
1. 两数之和 题目 两数之和题目 方法思路 hashMap 哈希表中存数组中的数到索引的映射关系 代码 class Solution { public: vector<int> twoSum(vector<int>& nums, int target) { unordered_map<int, int> hashMap; hashMap[nums[0]] = 0; vector<int> a原创 2021-09-17 13:35:56 · 49 阅读 · 0 评论 -
15. 三数之和
15. 三数之和 题目 三数之和题目 方法思路 排序+三指针+去重 代码 class Solution { public: vector<vector<int>> threeSum(vector<int>& nums) { if (nums.size() <= 1) return {}; vector<vector<int>> ans; // 排序 sort(原创 2021-09-17 13:24:04 · 55 阅读 · 0 评论 -
912. 排序数组(快排实现)
912. 排序数组(快排实现) 题目 排序数组 方法思路 快排 随机定义标志 代码 class Solution { public: void swap(vector<int>& nums, int i, int j) { int t = nums[i]; nums[i] = nums[j]; nums[j] = t; } void randF(vector<int>& nums, int原创 2021-09-17 11:57:10 · 42 阅读 · 0 评论 -
25. K 个一组翻转链表
25. K 个一组翻转链表 题目 K 个一组翻转链表题目 变式:不足k个也反转,见代码注释 方法思路 单链表反转的综合运用 具体看代码注释 代码 /** * Definition for singly-linked list. * struct ListNode { * int val; * ListNode *next; * ListNode() : val(0), next(nullptr) {} * ListNode(int x) : val(x), n原创 2021-09-17 11:28:59 · 37 阅读 · 0 评论 -
215. 数组中的第K个最大元素
215. 数组中的第K个最大元素 题目 215. 数组中的第K个最大元素题目 变式题:找出n个元素的无序数组中的中位数,此时k为n / 2 方法思路 堆(手写) 先将前k个数建立一个k个大小的小根堆 然后从k位置依次遍历,将堆顶的数替换为较大的数加入到堆中,维持k个元素的小根堆 当遍历完后,堆顶元素就为数组中第k个最大的数 因为此时堆中保存着整个数组最大的k个数,又是小根堆,所以堆顶即为所求 代码 class Solution { public: // 交换数 void swap(vec原创 2021-09-16 13:05:40 · 36 阅读 · 0 评论 -
146. LRU 缓存机制
146. LRU 缓存机制 题目 146. LRU 缓存机制 方法思路 双向链表+hashMap hashMap中保存key->node的映射关系 链表结点中需要保存key,value和前后指针 需要定义虚拟头节点和尾结点,方便插入和删除 将当使用一个结点时,需要将该节点加入头部,需要删除时,删除尾部的结点并且删除hashMap中的映射关系,就实现了LRU的机制 代码 // 双链表结点定义 struct Node { // 用来记录key,当删除双链表尾部时,可以通过key删除哈希表中原创 2021-09-16 12:09:46 · 85 阅读 · 0 评论 -
3. 无重复字符的最长子串
3. 无重复字符的最长子串 题目 3. 无重复字符的最长子串题目 方法思路 1. 滑动窗口+hashMap hashMap记录元素和位置的对应信息 滑动窗口的右指针不断向右侧扩展 hashMap记录区间[l, r)中元素的位置信息 如果r扩展时某个元素出现过(在hashMap中存在)并且它的位置在[l, r)中,说明出现重复情况 此时需要更新l到出现重复的元素的下一个位置,并且更新该元素的位置为r,还需要判断最大值 2. 滑动窗口+桶 通过建立一个128大小的数组来存储字符和位置的对应关系 代码原创 2021-09-16 11:57:10 · 46 阅读 · 0 评论 -
206. 反转链表
206. 反转链表 题目 206. 反转链表题目 方法思路 递归版 记录子链表的尾结点 将head结点放在尾结点后面 代码 迭代版 /** * Definition for singly-linked list. * struct ListNode { * int val; * ListNode *next; * ListNode() : val(0), next(nullptr) {} * ListNode(int x) : val(x)原创 2021-09-16 10:16:26 · 45 阅读 · 0 评论 -
5. 最长回文子串
5. 最长回文子串 题目 给你一个字符串 s,找到 s 中最长的回文子串。 示例 1: 输入:s = “babad” 输出:“bab” 解释:“aba” 同样是符合题意的答案。 示例 2: 输入:s = “cbbd” 输出:“bb” 示例 3: 输入:s = “a” 输出:“a” 示例 4: 输入:s = “ac” 输出:“a” 提示: 1 <= s.length <= 1000 s 仅由数字和英文字母(大写和/或小写)组成 算法思路 中心扩散法进行求解 定义一个中心位置p,分别向原创 2021-09-15 18:00:36 · 40 阅读 · 0 评论 -
297. 二叉树的序列化与反序列化
297. 二叉树的序列化与反序列化 基本思路 序列化: 通过对二叉树进行搜索(深搜或者广搜)来进行序列化 使用先序遍历来实现序列 当遇到nullptr,将"null"加入序列 并且每个结点之间要用一定的符号进行分隔,这里使用"," 方便后面的反序列化 反序列化 先将序列以","分隔成单个元素,用vector<string>来存储 通过先序遍历来建树 代码实现 /** * Definition for a binary原创 2021-09-15 10:43:54 · 54 阅读 · 0 评论