合集-刷题
摘要:二分查找是很经典的算法了,写的时候虽然写对了,后面看了文章才知道细节还是蛮多的。 像target所在的区间,有[left,right]和[left,right)两种写法,会极大的影响边界处理条件。实质就在于我们需要在定义的区间内对target进行搜索,而不能有任何遗漏。后面的处理要和前面的区间范围配
阅读全文
摘要:采用双指针法。 双指针法容易出错的地方在于确定好两个指针的作用,用来保存的指针不要包含未经判定的元素 1、想明白两个指针的作用是什么。刚开始写时让两个指针都去检测是否等于val,判定语句比较多,还容易导致跳过某些元素。其实实际上只要确定:由左指针来保证它经过的元素都是不等于val的元素,右指针来保证
阅读全文
摘要:实际上需要考虑的是两个数组的按序合并,思路还是双指针法,很容易想到合并后数组的最大值只会在最左边或者最右边,而去掉这个元素后也是一样的操作。因此左指针从负数的最大值即最左边开始,右指针从正数的最大值即最右边开始,比较后更新位置。 这里需要想清楚的是结束条件,实际上更新位置后剩下的元素都是未并入的,因
阅读全文
摘要:这道题能够学习到如何高效的利用数组来表达信息。 实际上,数组能够承载信息的有: 数组元素值 数组元素值的符号,正负可以代表不同的信息 由于数组本来就是按顺序存储的,其下标或者我们存储元素的位置,能够表达帮助表达顺序 具体到这题,实际上我们需要从1递增寻找正整数,直到出现第一个不连续的正整数,比如1,
阅读全文
摘要:使用双指针法,注意一下更新左右指针的顺序就好了。这里还要注意一下终止条件,画个图就行了。leetcode里面头节点就是第一个存储数据的节点,没有虚拟头节点 class Solution { public: ListNode* reverseList(ListNode* head) { ListNod
阅读全文
摘要:思路简单,但是操作的时候还是要注意细节,特别是某些结点的next指针变化需要格外关注,报了很多次错。因为没注意到:每次替换两个结点后,应该让当前的后面的结点指向下两个结点的靠后一点的结点。主要还是画完图后没有走一遍链表 class Solution { public: ListNode* swapP
阅读全文
摘要:按照边遍历的顺序进行赋值,可以将整个任务分为多个螺旋完成,每个螺旋按边打印。最外层螺旋起始分别是(0,0)->(0,n-1)->(n-1.n-1)->(n-1,0)->(1,0),螺旋的最后一条边会比前三条短1,同时每次更新打印螺旋需要注意螺旋的边会减少1,因此在每层螺旋的最后一条边打印前更新长度即
阅读全文
摘要:正常思路,先遍历一遍链表得到长度,然后进行第二次遍历得到待删除结点的上一个结点 class Solution { public: ListNode* removeNthFromEnd(ListNode* head, int n) { ListNode* dummyHead = new ListNod
阅读全文
摘要:哈希肯定是能解的,就想着有没有其他方法。最开始的思路是翻转链表,然后再来找相交结点,但是题目要求不能改链表结构。 官方题解的第二种方法确实巧妙,如果有相交结点的话最多通过两次遍历就一定能找到。在分析中,其实我们也可以把两个不相交的链表看做相交,但是相交结点为nullptr 代码随想录上将两个链表尾部
阅读全文
摘要:最简单的思路:哈希。进阶那个快慢指针确实想不到。 //哈希,空间为O(n) class Solution { public: ListNode *detectCycle(ListNode *head) { unordered_set<ListNode*> adds ; if(head == null
阅读全文
摘要:这几道都比较简单,主要是熟悉哈希的操作 class Solution { public: bool isAnagram(string s, string t) { int alphab[26] = {0}; for(int i=0; i < s.size(); i++) { alphab[ s[i]
阅读全文
摘要:这道题也是经典的越写越复杂,最开始不能通过[3,3],6。然后就写判断map1[target-nums[i]]!=map1[nums[i]].还是不能通过,然后换成multimap,换完之后也不行。然后去查怎么获得相同key的value,然后知道了equal.range()。最后终于也是写出来了,但
阅读全文
摘要:开始的想法是对a中的每个元素建立一个set,然后对去b中寻找负的set元素。但是由于有四个vector,操作起来很容易重复或者遗漏。于是去看解析。 我们先取a、b数组,然后两次循环求出所有可能的和(key)以及出现的次数(value),建立一个unorder_map sumab。然后对c、d数组求出
阅读全文
摘要:很简单的一道题,这里要注意到不仅要每个字符都要有,而且数目也要大于等于。 class Solution { public: bool canConstruct(string ransomNote, string magazine) { int r[26] = {0}; int m[26] = {0}
阅读全文
摘要:自己的思路是将解的情况分类:只有三种情况 (正,0,负),(正,正,负),(负,负,正)。 将nums分为两个数组pos,保存正数;neg,保存负数。 当两个数组的长度小于nums的长度时说明存在0,这个时候利用哈希的方法可以找到第一种情况的所有解; 对于第二种情况,构建set:possum,保存两
阅读全文
摘要:和三数之和差不多 class Solution { public: vector<vector<int>> fourSum(vector<int>& nums, int target) { vector<vector<int>> ans; sort(nums.begin(), nums.end())
阅读全文
摘要:344没啥好说的 class Solution { public: void reverseString(vector<char>& s) { int len = s.size(); int left = 0; int right = len-1; while (left < len / 2 ) {
阅读全文
摘要:也是比较简单的一道题,声明一个ans字符串用来保存替换后的字符串,思路就是遇到不需要替换直接加入ans,遇到需要替换的就将一个“number”加入ans。使用了O(N)的额外空间,时间复制度为O(N)。 #include<bits/stdc++.h> using namespace std; int
阅读全文
摘要:从字符串的末尾往前处理,建立一个变量word_len保存每一个单词的长度,当 当前处理的字符为空格且word_len的长度不为0时说明已经读完一个单词了,此时将其加入答案字符串,并加入空格进行分隔。 这个时候发现最开始的一个单词会被忽略,这是因为这个时候字符串已经处理完了,不能再往前移动,干脆就单独
阅读全文
摘要:比较简单的一题 #include<iostream> #include<algorithm> using namespace std; int main() { int k; string s; cin >> k; cin >> s; int len = s.size(); reverse(s.be
阅读全文
摘要:基础题,没啥好说的。唯一需要注意的是栈弹出在入栈会改变顺序,队列不会。 class MyQueue { public: stack<int> m_stIn; stack<int> m_stOut; MyQueue() { } void push(int x) { m_stIn.push(x); }
阅读全文
摘要:一、直接记结论 将两个 s 连在一起,并移除第一个和最后一个字符。如果 s 是该字符串的子串,那么 s 就满足: 它可以由它的一个子串重复多次构成。 class Solution { public: bool repeatedSubstringPattern(string s) { string s
阅读全文
摘要:从文本串haystack中找到一个与模式串needle相匹配的子串,常规的暴力求解时间消耗很大,目前最常用的就是KMP算法。 KMP算法的核心思想就是利用前缀和后缀相同的部分,也就是最长公共前后缀来帮助匹配。具体的思路这两个回答讲的很好。 https://www.zhihu.com/question
阅读全文
摘要:编译技术学过 class Solution { public: bool isValid(string s) { stack<char> sts; if( s.size() % 2 != 0) return false; for(int i = 0; i < s.size(); i++) { if(
阅读全文
摘要:用栈保存已经遍历过的内容,但是与数组相比更方便访问、删除离当前访问元素最相邻的已访问元素(数组可以用置位来表示删除)。 class Solution { public: string removeDuplicates(string s) { stack<char> sts; for(int i =
阅读全文
摘要:也是经典的编译题目 class Solution { public: int evalRPN(vector<string>& tokens) { stack<long long> stll; for( int i = 0; i < tokens.size(); i++ ) { if( tokens[
阅读全文
摘要:主要是学习怎么使用单调队列,在这道题中,我们需要队列能够很快的输出最大值;同时还需要删除窗口移动后的不在窗口内的元素 接下来的问题就是实现push,pop,front。 push:逻辑上来说,当接收到一个新元素时,应该把它插入到队列中,因此需要出队比它小的,插入后再重新入队。但实际上,因为我们只需要
阅读全文
摘要:学会了怎么构建和使用优先队列后这题就比较简单了。 class Solution { public: vector<int> topKFrequent(vector<int>& nums, int k) { unordered_map<int, int> map; for(int i = 0; i <
阅读全文

浙公网安备 33010602011771号