
力扣刷题
lc520xyp
这个作者很懒,什么都没留下…
展开
-
375. 猜数字大小 II-动态规划
375. 猜数字大小 II这道题使用动态规划来解决,dp[i][j]表示的是,第i到第j结原创 2021-11-12 15:03:33 · 395 阅读 · 0 评论 -
299. 猜数字游戏-遍历记录
299. 猜数字游戏我的方法使用map记录不一样的地方的数值然后再次遍历,查看b的数量class Solution {public: string getHint(string secret, string guess) { unordered_map<char,int> secretMap; int a = 0; int b= 0; for(int i=0;i<guess.size();i++){原创 2021-11-08 10:51:55 · 2811 阅读 · 0 评论 -
407. 接雨水 II-小顶堆/广度优先遍历
407. 接雨水 II思路1使用小顶堆,按高度从小到大的顺序进行输出刚开始将边界元素添加到小顶堆当中遍历自己周围的4个位置,如果发现比自己的高度低,那么就将res加上他们之间的高度差。并将该遍历的位置加入到小顶堆当中,高度设置为他们之间的max。typedef pair<int,int> pii;class Solution {public: int trapRainWater(vector<vector<int>>& heightMap原创 2021-11-03 10:09:30 · 230 阅读 · 0 评论 -
869. 重新排序得到 2 的幂--不带重读的回溯/预处理哈希
869. 重新排序得到 2 的幂将输入的int转化为字符串并对字符串进行排序进行全排列,使用回溯的方法,注意防止重复的顺序出现再判断是不是2的powerclass Solution {public: vector<int> vis; bool isPowerOfTwo(int n){ return (n & (n-1)) ==0; } bool backtrack(string &nums, int idx, i原创 2021-10-28 21:53:22 · 131 阅读 · 0 评论 -
240. 搜索二维矩阵 II-z字形查找、二分查找
240. 搜索二维矩阵 II方法一 z字形查找从矩阵的右上角开始遍历,如果相等,返回true小于target,说明需要更大,row++;大于target,说明需要更小,col–;class Solution {public: bool searchMatrix(vector<vector<int>>& matrix, int target) { int row = matrix.size(),col = matrix[0].size原创 2021-10-25 13:21:28 · 714 阅读 · 0 评论 -
29. 两数相除-二分
29. 两数相除首先考虑边界情况,dividend为最小且divisor为最大的情况;以及divisor为1的情况。然后做除法的时候,使用step+step的形式,类似于二分的方法,减少迭代的次数。class Solution {public: int div(int a, int b){ if(a > b)return 0; int res = 1, step = b; while(a - step <= step){原创 2021-10-12 08:00:42 · 123 阅读 · 0 评论 -
223. 矩形面积-数学题
223. 矩形面积嗯···如题解,找上边小的和下边大的,左边大的和右边小的class Solution {public: int computeArea(int ax1, int ay1, int ax2, int ay2, int bx1, int by1, int bx2, int by2) { int s1 = (ay2-ay1) * (ax2-ax1); int s2 = (by2-by1) * (bx2-bx1); int s3 =0原创 2021-09-30 08:20:32 · 225 阅读 · 0 评论 -
743. 网络延迟时间-迪杰斯特拉
743. 网络延迟时间-迪杰斯特拉class Solution {public: int networkDelayTime(vector<vector<int>>& times, int n, int k) { const int inf = INT_MAX /2; vector<vector<pair<int,int>>> g(n); for(auto &t : ti原创 2021-09-29 23:01:39 · 104 阅读 · 0 评论 -
517. 超级洗衣机-贪心
517. 超级洗衣机贪心算法class Solution {public: int findMinMoves(vector<int>& machines) { int m =0; int n=machines.size(); for(int i : machines){ m +=i; } if (n ==0 ||m%n != 0 ) return -1;原创 2021-09-29 08:45:28 · 139 阅读 · 0 评论 -
437. 路径总和 III-树的深搜/前缀和的使用
437. 路径总和 III第一种方法:递归的方式,即将每个点都看成是根节点,看满足条件的个数。时间和空间复杂度为N2N^2N2 NNNint ans = 0;int rootSum(TreeNode* root,int targetSum){ if(root == nullptr) return 0; int ret = 0; if(root -> val == targetSum) ret ++; ret += roo原创 2021-09-28 08:52:54 · 176 阅读 · 0 评论 -
583. 两个字符串的删除操作-最长公共子序列-动态规划
583. 两个字符串的删除操作这道题是求最长公共子序列,使用二维dp数组,通关状态转移公式得到最后的结果。dp[i][j]={dp[i−1][j−1]+1, word 1[i−1]=word2[j−1]max(dp[i−1][j],dp[i][j−1]), word 1[i−1]≠word2[j−1]d p[i][j]= \begin{cases}d p[i-1][j-1]+1, & \text { word }_{1}[i-1]=\operato原创 2021-09-25 11:07:12 · 118 阅读 · 0 评论 -
430. 扁平化多级双向链表-链表的使用
430. 扁平化多级双向链表写一个递归函数,如果遇到node有child,就进行递归,返回开始节点和结束节点,然后进行prev和next的变换,得到最后的结果,记得把递归过的child设置成nullptr!/*// Definition for a Node.class Node {public: int val; Node* prev; Node* next; Node* child;};*/class Solution {public: v原创 2021-09-24 09:02:47 · 98 阅读 · 0 评论 -
725. 分隔链表-链表的分割
725. 分隔链表/** * Definition for singly-linked list. * struct ListNode { * int val; * ListNode *next; * ListNode() : val(0), next(nullptr) {} * ListNode(int x) : val(x), next(nullptr) {} * ListNode(int x, ListNode *next) : val(x),原创 2021-09-22 09:01:05 · 168 阅读 · 0 评论 -
42. 接雨水-动态规划,单调栈
42. 接雨水动态规划、 单调栈来解决。动态规划,就是分布看自己左右两侧最大的,取最小的与自己相减的正值即为收集到的雨水。单调栈的思想是,从栈底到栈顶,按照坐标对应数组的值递减如果出现不满足的情况,就进行相应的操作,即收集雨水,看代码可知class Solution {public: int trap(vector<int>& height) { int ans = 0; stack<int> st; f原创 2021-09-21 22:59:53 · 197 阅读 · 0 评论 -
37. 解数独
37. 解数独1 递归回溯使用三个记录数组,分别记录每行、每列、每块的数字的是否出现。首先将给的数组中已经给出的数字填好,即设置成true,然后对剩下的空白位置进行赋值递归。class Solution {private: bool line[9][9]; bool column[9][9]; bool block[3][3][9]; bool valid; vector<pair<int, int>> spaces;publi原创 2021-09-17 08:39:35 · 87 阅读 · 0 评论 -
212. 单词搜索 II
212. 单词搜索 II刚开始,想用深搜来解决,写的过程中也发现了自己的一些问题,对首字母的判断要写在dfs函数外,否则会重复循环判断记得哈希去重超时的代码class Solution {public: vector<int> dir = {1,0,-1,0,1}; vector<string> ans; unordered_map<string,int> ansm; vector<vector<bool>原创 2021-09-16 09:29:15 · 95 阅读 · 0 评论 -
162. 寻找峰值
162. 寻找峰值由于边界-1和n的值都是负无穷,也就是说,只要找到nums[i] < nums[i+1],在i的右侧,就一定会出现峰值元素,所以此题可以使用二分法来求解,通过判断i和i+1的关系来确定新的l和r的值。class Solution {public: int findPeakElement(vector<int>& nums) { int left = 0, right = nums.size() - 1; while(原创 2021-09-15 09:04:06 · 86 阅读 · 0 评论 -
524. 通过删除字母匹配到字典里最长单词
524. 通过删除字母匹配到字典里最长单词两个字符串的匹配问题,双指针遍历dictionary中的每一个string,通过双指针的形式来判断,如果最终匹配完string的话,就进行保存结果的操作,并判断长度以及字典序。class Solution {public: string findLongestWord(string s, vector<string>& dictionary) { string ans;  { int j = -1; next[0] = j; for(int i = 1; i < s.size(); i++) { // 注意i从1开始 while (j >= 0 && s[i] != s[j + 1]) { // 前后缀不相同了原创 2021-01-21 22:05:04 · 99 阅读 · 0 评论 -
力扣-每日一题20201222-103. 二叉树的锯齿形层序遍历
难度中等 103. 二叉树的锯齿形层序遍历解题思路使用vector的迭代器来遍历,新的结点直接插到后边,使用erase进行删除代码/** * Definition for a binary tree node. * struct TreeNode { * int val; * TreeNode *left; * TreeNode *right; * TreeNode(int x) : val(x), left(NULL), right(NULL) {}原创 2020-12-22 13:57:13 · 96 阅读 · 0 评论 -
力扣-每日一题20201218-389. 找不同
难度:简单 389. 找不同寻找两个字符串不同的一个字母计数法,统计出现的次数,s中出现+1,t中出现-1,发现小于零就返回对char的ASCII码进行求和,减去t的ASCII码和。使用位运算。原创 2020-12-18 10:16:05 · 143 阅读 · 0 评论 -
力扣-每日一题20201215-738. 单调递增的数字
难度:中等 738. 单调递增的数字思路这是一道贪心算法,要结果尽可能的大,我们需要从数的最高位开始确定,也就是从左到右。如果这a位数字小于右侧的数组,则符合要求;如果大于右侧的数字,就将这一位减1,并将后面的数字都设置为9,这样就保证了最高位是最大的。代码class Solution {public: int monotoneIncreasingDigits(int N) { string strN = to_string(N); int i = 1;原创 2020-12-15 14:11:21 · 110 阅读 · 0 评论 -
力扣-每日一题20201214-49. 字母异位词分组
每日一题 :难度中等49. 字母异位词分组第一种思路:将每个string进行排序。通过遍历vector中的string,对string按字符从小到大进行排序,然后使用map<string ,vector>来记录相同的排序后的string。最后遍历map,一次插入到结果中。代码class Solution {public: vector<vector<string>> groupAnagrams(vector<string>& strs原创 2020-12-14 14:44:15 · 224 阅读 · 0 评论 -
力扣-每日一题20201208-842. 将数组拆分成斐波那契序列
难度:中等 842. 将数组拆分成斐波那契序列思路使用回溯的思想,我们只需要确定前两位数字,后边的数字就可以根据前边的两个数字来确认和验证了,如果验证失败,就返回false,进行回溯,尝试下一个组合。在确认前两个数字时,使用for循坏来依次增大位数,每增大一位就进行一个递归。在第三个数及以后时,通过比较自己和sum的值,来确定是继续增大自己的值还是break,尝试下一次的递归。一些细节也要注意,比如不能大于int的最大值;数字的第一位不能为0;只有结果数组的数字数量大于3时,才返回正确的结果。代原创 2020-12-08 19:26:56 · 158 阅读 · 1 评论 -
力扣-每日一题20201207-861. 翻转矩阵后的得分
861. 翻转矩阵后的得分思路先对行进行变换,保证第一列的数字全都为1,然后对列进行变换,让每一列的1的个数都大于0的个数。然后遍历每一列,如果行首是1,对应位置的数不变,如果是0,对应位置是数就变,对列求和,看1多还是0多,再将这列的值加入到结果中去。代码class Solution {public: int matrixScore(vector<vector<int>>& A) { int m = A.size(); i原创 2020-12-07 12:36:45 · 111 阅读 · 1 评论 -
力扣-每日一题2020121-34. 在排序数组中查找元素的第一个和最后一个位置
难度中等:34. 在排序数组中查找元素的第一个和最后一个位置思路利用二分法,找到最左边的target,然后将target+1,用同样的方法也可以找最右边的target,只是注意right和left的变化区别。代码class Solution {public: vector<int> searchRange(vector<int>& nums, int target) { if(nums.size()==0) retu原创 2020-12-01 00:28:26 · 100 阅读 · 2 评论 -
单调栈的应用:力扣1673. 找出最具竞争力的子序列
单调栈的应用:难度中等1673. 找出最具竞争力的子序列给你一个整数数组 nums 和一个正整数 k ,返回长度为 k 且最具 竞争力 的 nums 子序列。数组的子序列是从数组中删除一些元素(可能不删除元素)得到的序列。在子序列 a 和子序列 b 第一个不相同的位置上,如果 a 中的数字小于 b 中对应的数字,那么我们称子序列 a 比子序列 b(相同长度下)更具 竞争力 。 例如,[1,3,4] 比 [1,3,5] 更具竞争力,在第一个不相同的位置,也就是最后一个位置上, 4 小于 5 。示例原创 2020-11-30 19:08:22 · 393 阅读 · 1 评论 -
力扣-每日一题20201130-767. 重构字符串
难度中等:767. 重构字符串思路将char出现的次数从到小进行排序,弹出最大的和次大的进行组合,再将剩下的放回去,接着执行,直到剩下零个或者一个,放到string最后边。在进行这些操作前还需对是否可以有解进行判断,当某个字符大于一半时,是不可能全部和别人进行组合的,刚开始我在纸上模拟的时候,想到了这种方法,但是奈何实现起来有些困难,就看了官方题解官方题解的第一个思路和我是一样的,但是它实现出来了,使用的是大顶堆,自定义了cmp函数,下面我将这种方法的代码发出来代码class Solutio原创 2020-11-30 13:06:37 · 155 阅读 · 1 评论 -
力扣-每日一题20201128-493. 翻转对
困难:493. 翻转对思路首先我想的是使用map,遍历到一个数时,统计这个数前面有多少个符合条件的数,但是这样会超时得想新的思路,我想起了昨天使用的二分法,通过一半一半的方式来减少时间复杂度,所以这道题是不是也可以这样做呢,答案是可以的,通过对0mid,mid+1len的递归,得到两部分的翻转对结果,然后还需要对0~len范围内的翻转对进行计算,由于左半部分和有半部分已经计算过了,并且此时已经排好序了,这时计算翻转数就很方便了,紧接着将两部分进行归并排序,形成一个有序数组,方向回溯后进行翻转数的统计原创 2020-11-28 09:56:26 · 180 阅读 · 0 评论 -
力扣-每日一题20201127-454. 四数相加 II
454. 四数相加 II思路刚开始想的是固定3个数,然后遍历一个数,如果符合条件的话,就计一次数,后来发现这样不行,那不成n4的时间复杂度了吗于是想到二分的方法,降低一半的复杂度,变成n2,具体的做法是将AB可能组成的数存在一起,将CD可能组成的数存在一起,然后寻找互为相反数的个数代码class Solution {public: int fourSumCount(vector<int>& A, vector<int>& B, vector<原创 2020-11-27 21:03:32 · 184 阅读 · 0 评论 -
力扣-每日一题20201125-1370. 上升下降字符串
1370. 上升下降字符串思路设置一个vector数组,记录每个字符的出现次数按照规则,递增取出字符,然后再递减取出字符返回结果代码class Solution {public: string sortString(string s) { vector<char> strs(26); for (auto c : s) strs[c - 'a']++; //记录出现的字符数量 string ans(s); i原创 2020-11-25 09:14:45 · 116 阅读 · 0 评论 -
力扣-每日一题20201124-222. 完全二叉树的节点个数
222. 完全二叉树的节点个数思路1可以直接递归求解代码1/** * Definition for a binary tree node. * struct TreeNode { * int val; * TreeNode *left; * TreeNode *right; * TreeNode(int x) : val(x), left(NULL), right(NULL) {} * }; */class Solution {public:原创 2020-11-24 16:13:58 · 170 阅读 · 0 评论 -
力扣-每日一题20201123-452. 用最少数量的箭引爆气球
力扣-每日一题20201121-452. 用最少数量的箭引爆气球思路按右边界从小到大进行排序,在气球的最右边界进行吹箭,这样可以最大的保证吹一个箭,它左边的气球都会被射中。保存每次吹箭位置,一次遍历points,如果气球的左边界不大于上次的吹箭位置,就说明这只气球已经被射中了,继续遍历下一个就可以。每次遍历时,如果吹箭,更新一下吹箭位置,并将吹箭数+1.代码class Solution {public: static bool cmp (const vector<int&g原创 2020-11-23 09:56:35 · 246 阅读 · 0 评论 -
力扣-每日一题20201122-242. 有效的字母异位词
每天至少练一道力扣,一起加油进步呀!冲冲冲题目链接:242. 有效的字母异位词,简单题使用unordered_map实现我首先想到的是使用map来实现,建立unordered_map<char,int>来统计字符出现的次数。具体实现可以直接看代码,注释已写好class Solution {public: bool isAnagram(string s, string t) { if(s.size()!= t.size()) return原创 2020-11-22 15:14:08 · 178 阅读 · 0 评论 -
力扣-每日一题20201121-148.排序链表
力扣-每日一题20201121-148. 排序链表解题思路:时间复杂度为O(nlogn)的排序算法有归并排序、堆排序和快排**,快排的时间复杂度最坏达到O(n²)。其中最适合链表的排序算法是归并排序,归并排序有两种实现方式:一种是自顶向下的递归实现,空间复杂度为***O(logn)***一种是自底向上的实现,空间复杂度为***O(1)***自顶向下方法实现思想使用快慢指针找到链表的中点,将链表拆分为两个部分。对两个子链表进行递归排序。将有序的两个子链表进行合并。原创 2020-11-21 22:19:52 · 148 阅读 · 1 评论