![](https://img-blog.csdnimg.cn/20201014180756923.png?x-oss-process=image/resize,m_fixed,h_64,w_64)
leetcode
江江蒋
这个作者很懒,什么都没留下…
展开
-
leetcode:146. LRU缓存机制
146. LRU缓存机制思路一开始的思路是用map来保存每个key和pair<value,顺序>,顺序是用1,2,3…来表示的,越后面越表示没被访问。每当执行get和put的时候,访问的那个pair就移到1,它之前的页面就全往后移一位。这样也是能过简单的样例的,但是在最后几个样例会超时。因为它每次put和get都会把所有的map遍历一遍,非常耗时。所以就去看了题解,发现需要用到哈希表来解决搜索的问题,用双向列表来解决排列的问题。这方面详细的介绍就去看题解吧~ac代码class LRUC原创 2020-06-23 19:21:00 · 144 阅读 · 0 评论 -
leetcode:面试题 16.18. 模式匹配
面试题 16.18. 模式匹配思路把pattern中的a和b看成两个不同的字符串。字符串value看成x个a和y个b按照pattern的模式组合起来的字符串。把所有的这些可能算出来看能不能凑成value。先计算满足a*x+b*y=c的所有(x,y)对vp。c表示value的大小。然后对vp进行遍历,看能不能凑成value。测试的数据中,有各种特殊样例。例如:pattern或者value为空的情况;pattern中a或b的个数为0的情况。把这些情况都考虑进去就过了。class Solution {原创 2020-06-22 23:59:14 · 731 阅读 · 0 评论 -
leetcode:1470. 重新排列数组
1470. 重新排列数组class Solution {public: vector<int> shuffle(vector<int>& nums, int n) { vector<int> v; for(int i = 0; i < n; i ++){ v.push_back(nums[i]); v.push_back(nums[i+n]); }原创 2020-06-18 21:49:57 · 143 阅读 · 0 评论 -
leetcode:1471. 数组中的 k 个最强值
1471. 数组中的 k 个最强值要想找到中位数,得先进行排序找到中位数之后,从左右两边一起往中间靠,满足条件的就push,直到k个class Solution {public: vector<int> getStrongest(vector<int>& arr, int k) { vector<int> ans; sort(arr.begin(), arr.end()); int num = a原创 2020-06-18 21:46:54 · 157 阅读 · 0 评论 -
leetcode:1472. 设计浏览器历史记录
1472. 设计浏览器历史记录题目你有一个只支持单个标签页的浏览器,最开始你浏览的网页是homepage,你可以访问其他的网站url,也可以在浏览历史中后退steps步或前进steps步。请你实现BrowserHistory类:BrowserHistory(string homepage) ,用homepage初始化浏览器类。void visit(string url)从当前页跳转访问url对应的页面。执行此操作会把浏览历史前进的记录全部删除。string back(int steps)在浏览原创 2020-06-18 21:43:12 · 228 阅读 · 0 评论 -
leetcode:503. 下一个更大元素 II
503. 下一个更大元素 II给定一个循环数组(最后一个元素的下一个元素是数组的第一个元素),输出每个元素的下一个更大元素。数字 x 的下一个更大的元素是按数组遍历顺序,这个数字之后的第一个比它更大的数,这意味着你应该循环地搜索它的下一个更大的数。如果不存在,则输出 -1。示例 1:输入: [1,2,1]输出: [2,-1,2]解释: 第一个 1 的下一个更大的数是 2;数字 2 找不到下一个更大的数;第二个 1 的下一个最大的数需要循环搜索,结果也是 2。注意: 输入数组的长度不会超过 1原创 2020-06-18 21:30:19 · 173 阅读 · 0 评论 -
leetcode:445. 两数相加 II
445. 两数相加 II给你两个 非空 链表来代表两个非负整数。数字最高位位于链表开始位置。它们的每个节点只存储一位数字。将这两数相加会返回一个新的链表。你可以假设除了数字 0 之外,这两个数字都不会以零开头。进阶:如果输入链表不能修改该如何处理?换句话说,你不能对列表中的节点进行翻转。思路进阶的做法还没去做,下面的做法还是先翻转,再用两数相加的解法做的。/** * Definition for singly-linked list. * struct ListNode { *原创 2020-06-18 20:29:33 · 158 阅读 · 0 评论 -
leetcode:2. 两数相加
2. 两数相加给出两个 非空 的链表用来表示两个非负的整数。其中,它们各自的位数是按照 逆序 的方式存储的,并且它们的每个节点只能存储 一位 数字。如果,我们将这两个数相加起来,则会返回一个新的链表来表示它们的和。您可以假设除了数字 0 之外,这两个数都不会以 0 开头。思路模拟一个加法器,设置一个进位符c,进位时为1,否则为0。然后从链表头开始,逐位相加,逢10进位就行了。当一个链表结束了,另一个链表还没加完,让剩下的链表和c相加。/** * Definition for singly-li原创 2020-06-18 20:28:07 · 134 阅读 · 0 评论 -
leetcode:215. 数组中的第K个最大元素
215. 数组中的第K个最大元素这里使用的是快速排序的思想,快排是每一次确定一个数的位置,左边的都比它小,右边的都比他大。但是直接用快排会需要更多的时间,这里相当于对快排进行剪枝,把快排中不需要的步骤去掉每次确定一个数的位置之后,如果第K个最大元素在左边,则只对左边进行搜索,否则对右边搜索当然,快排中的其他的优化也可以用在这里,比如取任意三个数中的中数来定位,或者是在搜索空间小于n=5时进行遍历,都可以。class Solution {public: int find(vector<原创 2020-06-18 15:27:42 · 96 阅读 · 0 评论 -
leetcode:41. 缺失的第一个正数
41. 缺失的第一个正数题目给你一个未排序的整数数组,请你找出其中没有出现的最小的正整数。提示:你的算法的时间复杂度应为O(n),并且只能使用常数级别的额外空间。解题思路这个题目增加了两个限制条件:时间复杂度为O(N),空间复杂度为O(1)。解法是比较巧妙的。假设,这个题目没有加时间复杂度的要求,那么我们只需要,对数组进行排序,然后遍历,很容易就能够求出未出现的最小整数。其实在这个过程中我们可以发现一个规律。那就是,在缺失的第一个正数之前,所有的数都是连续的,从1开始的(如果没有负数和零)。也原创 2020-06-18 13:52:11 · 84 阅读 · 0 评论 -
leetcode:208. 实现 Trie (前缀树)
208. 实现 Trie (前缀树)前缀树的思想:边表示字符(其实边和点都行)点的含义表示是否为单词结尾,也可另外再赋予其他含义insert过程先进行遍历,把前面所有的公共前缀遍历完然后在后面把剩下的字符加上最后end=true,表示这里是一个单词的结尾query过程先进行遍历,把前面所有的公共前缀遍历完遍历完公共前缀,这时候end=true,说明前面有这个字符串insert否则,没有struct node{ node(){ end = fa原创 2020-06-18 13:37:01 · 221 阅读 · 0 评论 -
leetcode:面试题 17.17. 多次搜索
面试题 17.17. 多次搜索完整的把字典树实现了一遍,不知道字典树的可以先去做实现Ties(前缀树)这道题解题思路是,把smalls数组建成字典树,然后再从big[0],big[1]...开始query,一旦搜索到了smalls中的字符串,就把big[i]中的iiipush到相应的ans数组中。smalls中的string映射到vector 的下标有很多种方法,这里直接用map存下来,后面再传给vector。class Trie{private: Trie* t[26]; bool原创 2020-06-18 13:02:22 · 398 阅读 · 0 评论