自定义博客皮肤VIP专享

*博客头图:

格式为PNG、JPG,宽度*高度大于1920*100像素,不超过2MB,主视觉建议放在右侧,请参照线上博客头图

请上传大于1920*100像素的图片!

博客底图:

图片格式为PNG、JPG,不超过1MB,可上下左右平铺至整个背景

栏目图:

图片格式为PNG、JPG,图片宽度*高度为300*38像素,不超过0.5MB

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+

alex1997222的博客

BATTLE FOR A BETTER LIFE

  • 博客(29)
  • 问答 (1)
  • 收藏
  • 关注

原创 计算右侧小于当前元素的个数(归并排序)

###解题思路归并排序###代码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

原创 (模板)旋转数组模板

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

原创 剑指 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

原创 深度优先搜索去重(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

原创 *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

原创 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

原创 原地哈希法(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

原创 (背下来)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

原创 (背下来)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

原创 (考前看)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

原创 (背下来)简化路径(栈模拟)

###解题思路利用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

原创 找到字符串中所有字母异位词(异位词统计)

###解题思路首先利用哈希表保存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 299

原创 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

原创 *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

原创 (背思路)316. 去除重复字母(贪心)

###解题思路贪心思路:遍历字符串,尝试将每个字母入栈,如果栈顶字母值大于当前要入栈的字母的值,则将栈顶的那个字母出栈同时要保证每个元素的个数不为0开两张哈希表用来保存每个字母出现的次数以及是否已经存在于栈中然后遍历字符串即可###代码class Solution {public: vector<int> st; unordered_map<int,bool> vis; unordered_map<int,int> ..

2021-02-10 00:21:46 146

原创 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

原创 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

原创 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

原创 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

原创 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

原创 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

原创 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

原创 (必背)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

原创 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

原创 面试题 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 119

原创 区间合并算法

算法: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

原创 (必背)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

原创 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() &gt..

2021-02-01 14:55:09 133

原创 搜索二维矩阵(二分法)

编写一个高效的算法来判断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

空空如也

TA创建的收藏夹 TA关注的收藏夹

TA关注的人

提示
确定要删除当前文章?
取消 删除