leetcode刷题
leetcode刷题及经验总结
alex1997222
。。。。
展开
-
计算右侧小于当前元素的个数(归并排序)
###解题思路归并排序###代码class Solution {public: vector<int> res; vector<pair<int,int>> temp; vector<pair<int,int>> pairIdx; void mergeSort (vector<pair<int,int>>& nums,int l,int r){ if..原创 2021-02-25 19:55:59 · 324 阅读 · 0 评论 -
(模板)旋转数组模板
class Solution {public: int minArray(vector<int>& numbers) { if(numbers.size() == 1) return numbers[0]; //直接返回结果 int offset = numbers.size()-1; while(offset && numbers[0] == numbers[offset]) offset--; .原创 2021-02-24 15:40:04 · 242 阅读 · 0 评论 -
剑指 Offer 51. 数组中的逆序对
###解题思路利用归并排序算法:由于用于归并的两个序列是已序的,所以在进行两辆比对时,序列A中的一个数大于序列B中的一个数,那么序列A中这个数的后面所有数都大于这个数###代码class Solution {public: int res = 0; vector<int> temp; int mergeSort(vector<int>& nums,int l,int r){ if(l >= r) retur..原创 2021-02-24 14:21:56 · 272 阅读 · 0 评论 -
深度优先搜索去重(47. 全排列 II)
比如需要全排列的数组中存在重复元素,首先我们将数组排序将重复的元素放在一起,然后在递归的时候判断当前元素是否和其前一个元素值相等,如果相等,则判断前一个元素是否已经在dfs序列中(被使用过),如果前一个元素还没被使用过,则当前元素也无法被使用。因此这里的逻辑为:(nums[i-1]==nums[i] && !hm[i-1])class Solution {public: vector<bool> st; //这个数是否被用过 vector<in原创 2021-02-23 19:50:24 · 274 阅读 · 0 评论 -
*435. 无重叠区间(贪心)
###解题思路贪心策略:按照右端点从小到大排序,然后拼接区间###代码class Solution {public: static bool cmp(vector<int>& a,vector<int>& b){ return a[1] < b[1]; } int eraseOverlapIntervals(vector<vector<int>>& intervals)..原创 2021-02-17 12:20:59 · 121 阅读 · 0 评论 -
43. 字符串相乘(大数相乘模拟)
就是模拟乘法的一个过程,这里我们不按正常的乘法做法来做:我们在每一位相乘后不进行进位,而是保留相乘得到的结果,到最后相加的时候再去进行进位。如下图所示:代码如下所示:class Solution {public: string multiply(string num1, string num2) { vector<int> A,B; int n = num1.size(),m = num2.size(); for(int原创 2021-02-17 09:27:06 · 148 阅读 · 0 评论 -
原地哈希法(41,442,448)
某些类型的题目希望我们在解题时找到重复出现或是缺失的那个数却不让我们使用额外空间,这意味着我们无法使用额外的哈希表来统计数字出现的次数比如下面这道题目:442给定一个整数数组 a,其中1 ≤ a[i] ≤ n (n为数组长度), 其中有些元素出现两次而其他元素出现一次。找到所有出现两次的元素。你可以不用到任何额外空间并在O(n)时间复杂度内解决这个问题吗?示例:输入:[4,3,2,7,8,2,3,1]输出:[2,3]我们在遍历这个数组的过程中,首先把每个数字其真正对应位置原创 2021-02-15 20:37:36 · 374 阅读 · 0 评论 -
(背下来)169. 多数元素(BM投票法)
###解题思路BM算法如果当前字符和前一个字符一样:计数++如果当前字符和前一个字符不一样:1.如果c>0,则c--2.如果c==0,则把r替换为当前字符,c=1###代码class Solution {public: int majorityElement(vector<int>& nums) { int r ,c = 0; for(auto x : nums){ if(!c) r..原创 2021-02-15 19:14:12 · 156 阅读 · 0 评论 -
(背下来)59. 螺旋矩阵 II
###解题思路经典模拟题,首先定义row=0,col=-1然后用试探法判断下一步有没有越界以及可不可以摆放相应的元素###代码class Solution {public: vector<vector<int>> generateMatrix(int n) { vector<vector<int>> res(n,vector<int>(n,0)); int row = 0,co...原创 2021-02-15 02:38:40 · 119 阅读 · 0 评论 -
(考前看)57. 插入区间(二分+区间合并)
###解题思路利用二分法找到合适的位置插入区间1.枚举特殊情况:插入最左端和插入最右端2.找到第一个区间,使得区间的右端点大于目标区间的左端点3.找到第二个区间,使得区间的右端点大于目标区间的右端点4.处理一种特殊情况,就是这个区间单独成为区间段,不与其他区间合并###代码class Solution {public: int binsearch(int l,int r,int tar,vector<vector<int>>& in..原创 2021-02-13 00:31:26 · 124 阅读 · 0 评论 -
(背下来)简化路径(栈模拟)
###解题思路利用string来模拟栈的思维###代码class Solution {public: string simplifyPath(string path) { if(path.back() != '/') path += '/'; string res,name; for(auto c : path){ if(c != '/') name+=c; else{ ..原创 2021-02-12 21:10:29 · 89 阅读 · 0 评论 -
找到字符串中所有字母异位词(异位词统计)
###解题思路首先利用哈希表保存s1中字符出现的次数利用双指针在s2中维护一段长度为s1的滑动窗口,然后统计这段窗口中的字符出现次数是否与s1一致把符合条件的字符串首字母加入哈希表###代码class Solution {public: unordered_map<char,int> hm1,hm2; vector<int> findAnagrams(string s, string p) { vector<int&g..原创 2021-02-11 23:29:53 · 300 阅读 · 0 评论 -
63. 不同路径 II
###解题思路在62题的基础上加上了判断每一个格子能不能走还是62题的做法,把不能走的格子置为0即可###代码class Solution {public: int uniquePathsWithObstacles(vector<vector<int>>& obstacleGrid) { int m = obstacleGrid.size(),n = obstacleGrid[0].size(); if(m ==..原创 2021-02-10 02:21:47 · 169 阅读 · 0 评论 -
*662. 二叉树最大宽度(层序遍历+保留每一层的位置)
解题思路用pos2与pos2+1来保存节点的位置,在层序遍历中,每一层第一个遍历到的节点就是该层的左边界然后通过res = max(res,pos-l+1)来求最长宽度(不用去寻找右边界)利用unsigned long long来保存每个节点的位置防止越界代码class Solution {public: queue<pair<unsigned long long,TreeNode*>> q; int widthOfBinaryTree(TreeNo原创 2021-02-10 01:24:29 · 202 阅读 · 0 评论 -
(背思路)316. 去除重复字母(贪心)
###解题思路贪心思路:遍历字符串,尝试将每个字母入栈,如果栈顶字母值大于当前要入栈的字母的值,则将栈顶的那个字母出栈同时要保证每个元素的个数不为0开两张哈希表用来保存每个字母出现的次数以及是否已经存在于栈中然后遍历字符串即可###代码class Solution {public: vector<int> st; unordered_map<int,bool> vis; unordered_map<int,int> ..原创 2021-02-10 00:21:46 · 146 阅读 · 0 评论 -
138. 复制带随机指针的链表
###解题思路和克隆图133是一个思路,利用哈希表保存每个节点克隆出来的节点,边遍历边克隆###代码class Solution {public: unordered_map<Node*,Node*> hm; Node* copyRandomList(Node* head) { if(head == NULL) return head; Node* p = head; Node* root = new Node(..原创 2021-02-09 02:11:48 · 125 阅读 · 0 评论 -
725. 分隔链表
###解题思路1.首先求出链表中一共有多少个元素n2.然后通过n/k判断一共要分成几块3.通过n%k判断多出来多少个节点,把他们分别分配到对应的块中去###代码class Solution {public: vector<ListNode*> splitListToParts(ListNode* root, int k) { int n = 0; for(auto p=root;p;p=p->next) n++; /..原创 2021-02-09 01:41:40 · 103 阅读 · 0 评论 -
25. K 个一组翻转链表
###解题思路分治法,按k个一组翻转链表(翻转后头节点变为尾节点,尾节点变为头节点),然后递归进行下k个的元素的翻转,直到找到一组节点个数不满足k个###代码class Solution {public: int nk = 0; ListNode* merge(ListNode* node){ if(node == nullptr) return nullptr; ListNode* a = node; ListNode* ..原创 2021-02-07 01:08:17 · 113 阅读 · 0 评论 -
23. 合并K个升序链表(优先队列)
###解题思路首先将每个链表的头节点加入优先队列,然后依次将优先队列的头节点拼接到新的链表头上去,并将该头节点的下一个节点加入优先队列(要注意判断空节点)###代码class Solution {public: typedef pair<int,int> PII; priority_queue <PII,vector<PII>,greater<PII>> q; ListNode* mergeKLists(vector..原创 2021-02-07 00:30:33 · 179 阅读 · 0 评论 -
86. 分隔链表
###解题思路新建两个链表头,按照归并排序的思想依次将小于x和大于x的节点插入表头后连接两个表###代码class Solution {public: ListNode* partition(ListNode* head, int x) { ListNode* lt = new ListNode(-1); ListNode* rt = new ListNode(-1); ListNode* lh = lt; Li..原创 2021-02-06 23:53:43 · 94 阅读 · 0 评论 -
61旋转链表
###解题思路首先计算出链表的长度n,然后统计出要翻转的次数s=k%n将链表后s个元素翻转,就可以实现倒序遍历之后依次倒序遍历将队尾元素移动到队头记得将结尾元素的next置空为0###代码class Solution {public: ListNode* rotateRight(ListNode* head, int k) { int n = 0; ListNode *p = head; while(p) p =...原创 2021-02-06 17:25:57 · 90 阅读 · 0 评论 -
206链表翻转
###解题思路利用双指针将链表进行翻转###代码class Solution {public: ListNode* reverseList(ListNode* head) { if(head == NULL) return NULL; ListNode* a = head; ListNode* b = a->next; while(b){ auto c = b->next; ..原创 2021-02-06 16:23:04 · 72 阅读 · 0 评论 -
(必背)234. 回文链表(翻转链表后半部分)
1.首先计算出后半部分链表的长度 half = n / 22.移动到链表的中间位置 n-half3.翻转后半部分链表 a = b,b = c4.判断是否为回文串5.将链表再翻转回来6.记得要将结尾节点的next置为nullptrclass Solution {public: bool isPalindrome(ListNode* head) { int n = 0; ListNode* p = head; while(p){原创 2021-02-06 16:14:39 · 490 阅读 · 0 评论 -
160. 相交链表(双指针)
###解题思路双指针算法,定义p1和p2分别指向头节点headA和headB,让p1,p2同时走,如果p1走到尽头,则让p1指向headB,如果p2走到尽头,则让p2指向headA直到两个指针相遇为止(注:如果两个链表不相交,则p1p2在走到尽头分别交换头节点后,再次走到尽头仍不相遇)###代码class Solution {public: ListNode *getIntersectionNode(ListNode *headA, ListNode *headB) { ..原创 2021-02-04 14:50:40 · 113 阅读 · 0 评论 -
面试题 01.07. 旋转矩阵
###解题思路先对矩阵进行镜像操作然后再按照对角线反转###代码class Solution {public: void rotate(vector<vector<int>>& matrix) { for(auto &p: matrix) reverse(p.begin(),p.end()); //先镜像操作 //对角线互换 int n = matrix.size()-1; ..原创 2021-02-02 22:46:40 · 120 阅读 · 0 评论 -
区间合并算法
算法:st,ed表示当前区间的左端点和右端点1.将所有区间按左端点排序2.扫描整个区间,扫描的过程中,将所有可能有交集的区间合并 (1)a区间在当前区间的内部:st和ed不变 (2)a区间和当前区间有交集:ed更新为a区间的右端点 (3)a区间和当前区间没有交集: 将当前区间计入答案,st更新为a区间左端点,ed更新为a区间右端点class Solution {public: typedef pair<int,int> PII; vector&l...原创 2021-02-02 22:07:14 · 366 阅读 · 0 评论 -
(必背)149. 直线上最多的点数(枚举法+哈希)
###解题思路枚举每个点,求以这个点作为中心点时经过其的所有直线,并求出拥有最多点的直线注意重合的点和垂直的点###代码class Solution {public: int maxPoints(vector<vector<int>>& points) { int res = 0; for(auto &p: points){ int ss = 0,vs = 0; ..原创 2021-02-02 21:17:01 · 142 阅读 · 0 评论 -
491. 递增子序列(DFS)
###解题思路直接暴力,枚举每一种情况,注意要进行判重操作###代码class Solution {public: vector<vector<int>> res; vector<int> temp; void sdfs(int u,int last,vector<int>& nums){ if(u == nums.size()){ if(temp.size() >..原创 2021-02-01 14:55:09 · 133 阅读 · 0 评论 -
搜索二维矩阵(二分法)
编写一个高效的算法来判断m x n矩阵中,是否存在一个目标值。该矩阵具有如下特性:每行中的整数从左到右按升序排列。每行的第一个整数大于前一行的最后一个整数。class Solution {public: bool searchMatrix(vector<vector<int>>& matrix, int target) { int n = matrix.size(),m = matrix[0].size(); int ..原创 2021-02-01 14:01:27 · 246 阅读 · 0 评论 -
279. 完全平方数(完全背包)
###解题思路一个典型的完全背包问题###代码class Solution {public: int numSquares(int n) { vector<int> tab; for(int i = 1; i <= 100;++i){ if(pow(i,2) <= n){ tab.push_back(pow(i,2)); }else break;..原创 2021-01-28 16:15:20 · 94 阅读 · 0 评论 -
542. 01 矩阵(多源BFS模板题)
给定一个由 0 和 1 组成的矩阵,找出每个元素到最近的 0 的距离。两个相邻元素间的距离为 1 。从每个为“0”的坐标开始进行广度优先遍历class Solution {public: typedef pair<int,int> PII; static const int INF = 2e9; int dx[4] = {1,-1,0,0}; int dy[4] = {0,0,1,-1}; vector<vector<int&g原创 2021-01-28 15:22:50 · 103 阅读 · 0 评论 -
(模板)循环队列
class MyCircularQueue {public: vector<int> q; int hh,tt,qsize; MyCircularQueue(int k) { q.resize(k); hh = -1,tt = -1,qsize = k; } bool enQueue(int value) { if(isFull()) return false; if(isEmpty()).原创 2021-01-28 13:47:05 · 106 阅读 · 0 评论 -
222. 完全二叉树的节点个数(树上二分)
###解题思路1.首先判断最左端和最右端层数是否一致2.如果不一致,则利用二分思想,将范围进行缩小(左右两侧必有一侧是完美二叉树)###代码class Solution {public: int countNodes(TreeNode* root) { if(root == nullptr) return 0; int x = 1,y = 1; TreeNode* l = root->left; TreeN..原创 2021-01-27 17:19:15 · 87 阅读 · 0 评论 -
297. 二叉树的序列化与反序列化(层序遍历+字符串处理)
###解题思路层序遍历构造字符串,用特殊符号隔开在构造树时要新建结点并将第一个结点赋值给root我是真的烦死了这道题###代码class Codec {public: string serialize(TreeNode* root) { string data = ""; if(root == NULL) return data; queue<TreeNode*> q; q.push(root);..原创 2021-01-27 16:30:27 · 134 阅读 · 0 评论 -
(模板必背)根据二叉树的前序(后序)和中序遍历建立二叉树
根据前序和中序建树class Solution {public: unordered_map<int,int> pos; TreeNode* build(vector<int>& preorder, vector<int>& inorder,int il,int ir,int pl,int pr){ if(il > ir) return nullptr; TreeNode* root = new原创 2021-01-27 11:22:19 · 111 阅读 · 1 评论 -
(模板)删除二叉树上的某个节点
###解题思路要删除的节点分为三种情况1.节点既没有左子树也没有右子树:直接删除即可2.节点只有左子树或者右子树:用子节点替换即可3.既有左子树又有右子树:找到该节点的后继(比该节点大的最小数),替换后递归删除后继###代码class Solution {public: void delNode(TreeNode* &root,int val){ //加引用可以直接操作节点 if(!root) return; if(root..原创 2021-01-23 11:37:08 · 436 阅读 · 1 评论 -
124. 二叉树中的最大路径和(树上的路径)
###解题思路求整棵树上的最长路径,我们可以把这个问题化为若干个子问题,即求经过每个子节点的最长路径设x为树上的一个子节点,那么经过该点的最大路径可以表示为f(x) = max(f(x->left)+f(x->right))+x,即其左子节点的最长路径和右子节点的最长路径加当前路径之和利用后序遍历就可以解决###代码class Solution {public: int ans = INT_MIN; int sdfs(TreeNode* root){..原创 2021-01-22 14:29:56 · 105 阅读 · 0 评论 -
对称二叉树(递归法+迭代法)
递归法class Solution {public: bool scheck(TreeNode* p,TreeNode* q){ if(!p && !q) return true; //树叶节点 if(!p || !q) return false; return p->val == q->val && scheck(p->left,q->right) && scheck(原创 2021-01-22 11:29:58 · 107 阅读 · 0 评论 -
(必背)二叉树的前中后序遍历(利用栈)
二叉树的前序遍历(利用栈)1.首先将根节点压入栈2.栈中的首元素出栈,然后先将其右节点压入栈中,再将栈中的左节点压入栈中(如果左右节点分别存在的话)3.重复步骤2直到栈为空class Solution {public: stack<TreeNode*> st; vector<int> preorderTraversal(TreeNode* root) { vector<int> res; if(root原创 2021-01-22 08:07:19 · 1379 阅读 · 0 评论 -
41. 缺失的第一个正数(原地哈希)
###解题思路通过两两交换把所有元素放到其对应的位置上去###代码class Solution {public: int firstMissingPositive(vector<int>& nums) { int n = nums.size(); for(int i = 0; i < nums.size(); ++i){ //把所有元素放到对应的位置上去 while(nums[i] > 0 ..原创 2021-01-20 08:26:47 · 101 阅读 · 0 评论