每日一题
文章平均质量分 51
小pig饲养员
为了独立游戏正在努力积攒经济基础的程序员。
展开
-
LeetCode:1590. 使数组和能被 P 整除
lc每日一题 2023.3.10原创 2023-03-10 16:19:35 · 498 阅读 · 1 评论 -
LeetCode每日一题-6.10-518-零钱兑换II
题目描述思路 动态规划如果比较有经验,应该一开始就会觉得是青蛙跳台阶的改版,也就是给了你能够跳的台阶的数组,并且取消排列算不同方案。首先给定可以跳的数组,只需要修改函数变为dp[i] = dp[i - coin[0]] + dp[i - coin[1]] + . . . . .dp[i - coin[n]]那么可能理所当然会写出这样的代码 for(int i = value; i <= amount; i++) { for(int i =原创 2021-06-10 22:48:31 · 183 阅读 · 2 评论 -
LeetCode每日一题-4.28-633-平方数之和
题目描述解法 逼近法一个数从0,另一个从sqrt(c)开始,0的那个只增不减,sqrt©只减不增。 bool judgeSquareSum(int c) { long long l = 0, r = sqrt(c); if(c == 0) return true; while(l * l + r * r != c && l <= r) { if(l * l + r * r > c) {原创 2021-06-06 14:53:34 · 135 阅读 · 0 评论 -
LeetCode每日一题-4.17-220-存在重复元素III
题目描述解法 滑动窗口 + 集合保证abs(i - j)只需要使用滑动窗口即可,那么需要的就是在这个固定大小的窗口找到两个数,保证abs(num[i] - num[j] <= t)由于数组的元素是无序的,所以如果我们每次加入一个新的元素都去全部比较一边,是非常耗时的,所以就会想到在插入窗口的时候把它变成有序的。那么理所当然就会使用集合来插入。再结合stl的set内置的api:s.lower_bound(num)//可以找到第一个比num大的元素就能得到代码,详细思路写在注释了。cla原创 2021-06-06 14:30:31 · 157 阅读 · 0 评论 -
LeetCode每日一题-6.5-203-移除链表元素
题目描述解法 双指针使用pre和cur指针这是第一遍尝试的代码class Solution {public: ListNode* removeElements(ListNode* head, int val) { if(head == nullptr) return nullptr; ListNode* cur = head; ListNode* pre = cur; while(cur && cur -&g原创 2021-06-05 23:54:53 · 149 阅读 · 2 评论 -
LeetCode每日一题-4.14-208-实现Trie(前缀树)
这题似乎就是单纯考察前缀数的知识,也是菜鸡第一次听说前缀树。学点新东西吧。Trie入门操作Trie的数据结构struct TrieNode { bool isEnd; //该结点是否是一个串的结束 TrieNode* next[26]; //字母映射表};三种操作插入实现:这个操作和构建链表很像。首先从根结点的子结点开始与 word 第一个字符进行匹配,一直匹配到前缀链上没有对应的字符,这时开始不断开辟新的结点,直到插入完 word 的最后一个字符,同时还要将最后一个结点原创 2021-04-14 23:25:47 · 116 阅读 · 0 评论 -
LeetCode每日一题-4.6-80-删除有序数组中的重复项II
前置题目26-删除有序数组中的重复项解法 快慢指针将一个有序数组变成每个数字只能出现一次的数组,由于要求的空间复杂度是O(1)而且是原地修改,所以就很容易联想到用双指针。一个指针负责遍历数组,另一个在指定位置填入数字。初始:由于可以保证至少放入一个元素,所以两个指针都从下标1往后遍历逻辑:slow指向的是待填入元素的位置,所以nums[]...原创 2021-04-06 22:01:24 · 134 阅读 · 0 评论 -
LeetCode每日一题-4.4-781-森林中的兔子
题目描述找规律思路见注释class Solution {//思路:相同数字说明同一群,不同说明不同群,没群个数为该数字+1public: int numRabbits(vector<int>& answers) { unordered_map<int, int> m; int ans = 0; //统计每个数字出现的次数 for(int num : answers) {原创 2021-04-04 13:43:26 · 143 阅读 · 0 评论 -
LeetCode每日一题-3.31-90-子集II
第一眼感觉是类似全排列的做法,于是先去试着做了一下78-子集I子集-I题目描述每个元素都各不相同,所以这题无需考虑剪枝解法 递归想法和全排列很相似,对于全排列,采用dfs:我们每一步将元素与后面所有元素交换位置,使当前位置全部元素都排过一次,交换完:即固定一个之后dfs(step+1),然后等递归回来再把元素换回去。 void dfs(string& s,int step) { if(step>=s.size()) {原创 2021-03-31 18:18:50 · 172 阅读 · 0 评论 -
LeetCode每日一题-3.20-150-逆波兰表达式求值
所谓你波兰表达式就是后缀表达式,奇怪的知识又增加了。题目描述思路 栈因为题目说了保证是合法的表达式,所以不需要关心不符合题意的情况遇到数字,将字符串转换为数字,存入栈中遇到字符,从栈取出两个数字,第一个作为第二个运算数,第二个作为第一个运算数,将结果存入栈中。最后栈首就是结果。所以难点还是**“将字符串转换为数字”**,如果这题是char会舒服很多,但偏偏就是要用string。ps:其实也可以使用s[0] - ‘0’。这就考察了对stoi/atoi函数的掌握程度。大致来说,这两个函数原创 2021-03-20 23:39:12 · 145 阅读 · 0 评论 -
LeetCode每日一题-3.6-503.下一个更大元素II
题目描述解法 单调栈思路如注释class Solution {public://思路://维护一个单调递减的栈,里面存放元素下标//遍历数组,发现当前元素大于栈里面元素,说明当前元素是这些元素的下一个更大元素//将这些比较小的元素出栈,他们的下一个更大的数就是当前元素。 vector<int> nextGreaterElements(vector<int>& nums) { int len = nums.size();原创 2021-03-06 14:34:16 · 96 阅读 · 0 评论 -
LeetCode每日一题-2.15-485. 最大连续 1 的个数 + 2.19-1004. 最大连续1的个数 III
485题目描述思路 滑动窗口这题实际上不需要滑动窗口,遇到1的话cnt++,遇到0cnt清零就行,但是敬业的找工作狗肯定要练练滑动窗口class Solution {public: int findMaxConsecutiveOnes(vector<int>& nums) { int l = 0, r = 0; int len = nums.size(); int ans = 0; while(r &l原创 2021-02-20 18:32:26 · 176 阅读 · 0 评论 -
LeetCode每日一题-2.13-448. 找到所有数组中消失的数字
题目描述思路 哈希表使用额外空间,统计一遍数字以后寻找不存在的数字即可,代码很容易略思路 原地统计题目要求不开辟额外的空间,所以我们必须借助这个数组进行统计。这里采用的思路是,遍历数组,使下标为[数组元素大小-1]的元素+数组长度,这样最后哪个下标的元素<len,就说明其下标+1的元素没有出现。注释代码写得很清楚了class Solution {public://思路:对于数组里面的每个数字,使得数字下标-1位置的元素+= n;//第二遍寻找的时候只要某个元素小于等于n,就说明原创 2021-02-20 15:57:56 · 150 阅读 · 0 评论 -
LeetCode每日一题-2.12-119. 杨辉三角 II
题目描述解法 模拟计算根据杨辉三角的性质逐行计算设一个开辟能容纳杨辉三角的二维数组,每一行通过变量i对应,列通过j控制:每行的元素对应dp[i][0] ~ dp[i][j]容易发现除了边界为1,其他的公式为dp[i][j] = dp[i - 1][j - 1] + dp[i - 1][j];class Solution {public: vector<int> getRow(int rowIndex) { vector<vector<int&g原创 2021-02-20 15:31:03 · 156 阅读 · 0 评论 -
LeetCode每日一题-2.11-1423-可获得的最大点数C++
题目描述解法 小根堆解决TOP K问题小根堆解决TOP K思路:找最小值首先建立大根堆,然后压入k个数剩下来的每个数先压入,然后弹出堆顶元素全部元素压入结束后堆顶就是第k小的数找最大值首先建立小根堆,然后压入k个数剩下来的每个数先压入,然后弹出堆顶元素全部元素压入结束后堆顶就是第k大的数ps:C++默认的是大根堆,这里可以记一下大小根的写法小跟greater priority_queue<int, vector<int>, greater<int&g原创 2021-02-20 12:37:27 · 153 阅读 · 0 评论 -
Leetcode每日一题2/6~2/10总结
还是关于滑动窗口的问题2/61423-可获得的最大点数2/7题目描述思路 逐步判断法注释已经说得很清楚了class Solution {public: bool checkPossibility(vector<int>& nums) { int len = nums.size(); if(len < 3) return false; int count = 0; for(int i = 1;原创 2021-02-10 20:07:07 · 143 阅读 · 0 评论 -
Leetcode-904+992-水果成篮+k个不同整数的子数组
904题目描述理解题目的意思其实是:我们要在指定的数组里面,找到包含有两个不同整数的最大子数组思路 滑动窗口同样采用经典做法:不断探索窗口右边界直到到达数组边界当右边界遇到特殊情况时,改变左边界使得满足要求每次更新解具体思路就不写了,不难class Solution {public: int totalFruit(vector<int>& tree) { int left = 0, right = 0, res = 0;原创 2021-02-10 14:09:28 · 141 阅读 · 0 评论 -
LeetCode每日一题-2.6-1423-可获得的最大点数C++
今天桌游输了二十几,省吃俭用的我心态爆炸QAQ题目描述错误示范觉得那边大就取哪边,直到取到k个数,今天一直都蠢蠢的反例[11,49,100,20,86,29,72]4这样的思路会得出 72 - 29 - 86 - 20,但实际上是 72 - 11 - 49 - 100class Solution {public: int maxScore(vector<int>& cardPoints, int k) { int i = 0, j = card原创 2021-02-06 20:21:50 · 204 阅读 · 0 评论 -
Leetcode每日一题2/1 ~2/5总结
开始积累自己的题量了,不得不说LeetCode这种专门针对一类题目的每日一题真的太适合萌新了,这个月做完希望滑动窗口的题目能够自信手撕。2/1 :思路:我们可以分别算出爱丽丝和鲍勃的糖果棒大小的总和,这样对于鲍勃/爱丽丝的每一根糖果,需要爱丽丝/鲍勃交换的那根的大小就是固定的。然后就变成寻找数字的问题了。采用哈希是查找最快的方法。class Solution {public: vector<int> fairCandySwap(vector<int>& A,原创 2021-02-05 11:31:51 · 185 阅读 · 0 评论 -
LeetCode每日一题-2.3-480-滑动窗口中位数C++
题目描述思路 multiset看到困难题,小萌新稍微想了一下想用之前求中位数的方法:大根堆和小根堆,但是代码是在是太长了,只是为了春招没必要那么卷,于是去找了multiset的解法。set的本质是红黑树:平衡二叉搜索树。而multiset是可以有重复元素的set由于对stl还处在一知半解的地步,昨晚还在想着set有什么用呢,今天就意识到了。set里面的数字是可以用迭代器来获得的:配合prev和nextprev(迭代器,n)返回迭代器的前n个位置的迭代器。next(迭代器,n)返回迭代器原创 2021-02-03 18:49:01 · 245 阅读 · 0 评论 -
LeetCode每日一题-2.2-424-替换后的最长重复字符串C++
题目描述思路 滑动窗口其实一开始觉得是用动态规划做,后来才发现是很经典的滑动窗口问题我们假设k为0,那么求的就是最长重复子字符串。求最长重复字符串的思路如下:窗口从左至右不断扩张/滑动,当窗口触达字符串末尾字符时,运算结束,窗口的宽度为最终结果。初始窗口的宽度为 1,我们不断的通过向当前窗口覆盖的子串后面追加一个字符看是否能满足我们的要求:如果满足窗口扩张,如果不满足,窗口向右滑动。代码:class Solution {public: vector<int>原创 2021-02-03 16:22:42 · 211 阅读 · 0 评论 -
LeetCode每日一题-12.3-204-计算质数c++
题目描述解法 回去等通知法class Solution {public: int countPrimes(int n) { int ans = 0; for(int i = 2; i < n; i++) { if(isPrime(i)) ans++; } return ans; } bool isPrime(int num) { for(int i = 2; i * i &l原创 2020-12-03 20:08:20 · 146 阅读 · 1 评论 -
LeetCode每日一题-11.25-1370-上升下降字符串c++
题目描述给你一个字符串 s ,请你根据下面的算法重新构造字符串:从 s 中选出 最小 的字符,将它 接在 结果字符串的后面。从 s 剩余字符中选出 最小 的字符,且该字符比上一个添加的字符大,将它 接在 结果字符串后面。重复步骤 2 ,直到你没法从 s 中选择字符。从 s 中选出 最大 的字符,将它 接在 结果字符串的后面。从 s 剩余字符中选出 最大 的字符,且该字符比上一个添加的字符小,将它 接在 结果字符串后面。重复步骤 5 ,直到你没法从 s 中选择字符。重复步骤 1 到 6 ,直到原创 2020-11-25 20:23:29 · 217 阅读 · 0 评论 -
LeetCode每日一题-11.24-222-完全二叉树的节点个数c++
最近大概比之前那段时间有空一点点,抽一些时间来做一下每日一题题目描述解法 二分法首先想到的是完全二叉树只有最后一层不是满的,并且最后一排的结点在结束之前也是“满”的,所以用二分直接取到边界点。难点在于区间的左边和右边的点怎么表示。还不知道怎么表示解法 完全二叉树性质首先当一个树为完全二叉树时,其中的任何一个子树也都是完全二叉树。那么我们对每个子树分析,一个结点旗下的左子树和右子树的高度只有两种情况1.左子树大于右子树,此时说明右子树是满二叉树,继续对左子树递归2.左子树等于右子树,此时说明原创 2020-11-24 13:48:05 · 250 阅读 · 0 评论