lc每日1题
lc每日1题
qq_44038801
技术栈:Java
展开
-
2021.10.29打卡
335. 路径交叉思路:归纳class Solution {public: bool isSelfCrossing(vector<int>& distance) { int n=distance.size(); for(int i=3;i<n;++i){ if(distance[i]>=distance[i-2]&&distance[i-1]<=distance[i-3]){原创 2021-10-29 22:01:07 · 71 阅读 · 0 评论 -
2021.10.28打卡
869. 重新排序得到 2 的幂思路:预处理+哈希表由于我们可以按任意顺序对数字进行排序,因此对于两个不同的整数a和b,如果十进制表示的字符数组,从小到大排序的结果是相同的,那么若a能够重排得到2的幂,那么b也可以;若a不能重排得到2的幂,那么b也不能。进一步,只要a和b的十进制表示的字符数组中,从0到9每个字符的出现次数,在a和b中都是一样的,那么a和b能否重排得到2的幂的结果是一样的。首先对1到10910^9109的范围内的2的幂记录在哈希表中,之后对数字n处理,判断数字n对应的字符数组是否在哈原创 2021-10-28 21:38:06 · 1193 阅读 · 0 评论 -
2021.10.27打卡
301. 删除无效的括号思路:回溯+剪枝题目让我们删除括号使得剩下的括号匹配,要求删除最少的括号数,并且要求得到所有的结果。可以使用回溯算法,尝试遍历所有可能的去掉非法括号的方案。首先利用括号匹配的规则求出字符串s中最少需要去掉的lremove左括号数目和rremove右括号数目,然后尝试在原字符串中删除lremove个左括号和rremove个右括号,检测剩余字符串是否合法,如果合法可以认为该字符串为可能的结果。在回溯时利用以下的剪枝技巧增加搜索的效率:利用括号左右匹配的特点,设置变量lcoun原创 2021-10-27 23:33:53 · 86 阅读 · 0 评论 -
2021.10.26打卡
496. 下一个更大元素 I思路:单调栈+哈希表可以预处理nums2, 使用单调栈计算nums2每个元素右边的第一个更大的值,使用哈希表存储结果。单调栈维护当前位置右边更大的元素列表,从栈底到栈顶元素单调递减。具体地,每次移动到数组中一个新的位置i,就将当前单调栈所有小于nums2[i]的元素弹出单调栈,当前位置右边的第一个更大的元素即为栈顶元素,如果栈为空则说明当前位置右边没有更大的元素。随后将位置i的元素入栈。因为nums2没有重复元素,可以使用哈希表存储元素值和其右边第一个更大的元素值的对应原创 2021-10-27 22:37:39 · 69 阅读 · 0 评论 -
2021.10.25打卡
240. 搜索二维矩阵 II思路:Z字形查找从matrix的右上角(0,n-1)进行搜索,每一步的搜索过程中,如果位于位置(x,y),那么以matrix的左下角为左下角、以(x,y)为右上角的矩阵进行搜索。如果matrix[x] [y]==target,返回如果matrix[x] [y]>target,排除第y列,y减一如果matrix[x] [y]<target,排除第x行,x加一搜索过程中,超出矩阵边界,说明矩阵不存在targetclass Solution {publi原创 2021-10-27 22:22:17 · 69 阅读 · 0 评论 -
2021.10.24打卡
638. 大礼包思路:动态规划+记忆化搜索算法流程:过滤大礼包:如果大礼包没有优惠或者不包含任何物品,那么考虑过滤用dp[needs]表示满足购物清单needs所花费的最低价格,进行状态转移时,考虑2种情况:第一种情况是购买大礼包,此时状态转移方程为:dp[needs]=mini∈K{pricei+dp[needs−needsi]}dp[needs]=\mathop{min}\limits_{i\in K}\{price_i+dp[needs-needs_i]\}dp[needs]=i原创 2021-10-25 00:10:34 · 73 阅读 · 0 评论 -
2021.10.23打卡
492. 构造矩形思路:数学根据题目要求,可知:L⋅W=areaL\cdot W =areaL⋅W=area,意味着area可以被W整除L>=W,结合要求1可知W⋅W≤areaW \cdot W\leq areaW⋅W≤area,从而有W≤⌊area⌋W \leq \lfloor\sqrt{area}\rfloorW≤⌊area⌋初始化W=⌊area⌋W = \lfloor\sqrt{area}\rfloorW=⌊area⌋,不断循环area是否被W整除,可以跳出循环。class原创 2021-10-23 19:20:09 · 100 阅读 · 0 评论 -
2021.10.22打卡
229. 求众数 II思路:摩尔投票法摩尔投票法分为抵消阶段和计数阶段,抵消阶段将不同投票进行抵消,相同投票累加抵消次数。技术阶段将抵消计数不为0的候选人进行验证。为什么需要计数阶段?因为抵消阶段得到的候选人未必票数过半,例如[A,B,C],得到候选人C但是票数未过半。class Solution {public: vector<int> majorityElement(vector<int>& nums) { int element1=0,原创 2021-10-22 13:32:11 · 62 阅读 · 0 评论 -
2021.10.21打卡
66. 加一思路:模拟对数组digits进行一次逆序遍历,找到第一个不为0的元素,加一并将后续所有元素置0即可,如果digits种所有元素均为0,那么需要返回一个新数组。class Solution {public: vector<int> plusOne(vector<int>& digits) { for(int i=digits.size()-1;i>=0;--i){ if(digits[i]!=9){原创 2021-10-21 15:45:21 · 87 阅读 · 0 评论 -
2021.10.20打卡
453. 最小操作次数使数组元素相等思路:数学每次操作可以理解使1个元素减少1.class Solution {public: int minMoves(vector<int>& nums) { int minval=nums[0]; for(int i=1;i<nums.size();++i){ minval=min(minval,nums[i]); } int ans=0;原创 2021-10-20 13:34:40 · 59 阅读 · 0 评论 -
2021.10.19打卡
211. 添加与搜索单词 - 数据结构设计思路:前缀树添加单词,将单词添加到字典树搜索单词,从字典树的根节点开始搜索,遇到点号,对于所有的子节点进行遍历;如果是字母,判断对应的子节点是否存在struct TrieNode{ vector<TrieNode*> child; bool isEnd; TrieNode(){ child = vector<TrieNode*>(26, nullptr); isEnd = fal原创 2021-10-19 16:35:12 · 111 阅读 · 0 评论 -
2021.10.18打卡
476. 数字的补数思路:位运算对二进制num每一位取反,需要找到最高位的1,然后对这个1和更低的位取反。如果num二进制表示最高位的1是第i(0≤i≤30)位,那么一定有:2i≤i<2i+1因此可以使用一次遍历,找到i的值。之后,构造mask=2i+1-1和num进行异或。细节:当i=30时,考虑整数溢出判断。class Solution {public: int findComplement(int num) { int highbit=0;原创 2021-10-18 11:33:42 · 67 阅读 · 0 评论 -
2021.10.17打卡
230. 二叉搜索树中第K小的元素思路:中序遍历通过中序遍历找到第k个最小元素class Solution {public: int kthSmallest(TreeNode* root, int k) { stack<TreeNode*> stk; while(root!=nullptr||stk.size()){ while(root!=nullptr){ stk.push(root);原创 2021-10-17 16:58:44 · 62 阅读 · 0 评论 -
2021.10.16打卡
282. 给表达式添加运算符思路:回溯设字符串长度为n,为构建表达式,可以往num中间n-1个空隙添加+,-,*,或者不添加可以使用回溯法模拟,从左向右构建表达式,并实时计算表达式结果。由于乘法运算符优先级高于加法和减法,还需保存最后一个连乘串的结果。定义递归函数backtrack(expr,i,res,mul),其中:expr为当前构建的表达式i是当前枚举num的第i个数字res是当前表达式的计算结果mul是表达式最后一个连乘串的计算结果该函数分为2中情况:如果in,说明表达式构原创 2021-10-16 10:49:03 · 76 阅读 · 0 评论 -
2021.10.15打卡
38. 外观数列方法一:双指针要求Sn,从左向右依次扫描字符串Sn-1中连续相同字符的最大数目,然后连接到新的字符串。class Solution {public: string countAndSay(int n) { string prev="1"; for(int i=1;i<n;++i){ string curr; int start=0,pos=0; while(pos&l原创 2021-10-15 08:06:45 · 51 阅读 · 0 评论 -
2021.10.14打卡
剑指 Offer II 069. 山峰数组的顶部思路:二分考虑山峰数组,从中间切一刀,如果一边是单调递增或递减,那么峰顶在另外一边,然后继续对另外一边二分即可。class Solution {public: int peakIndexInMountainArray(vector<int>& arr) { int left=0,right=arr.size()-1; while(left<right){ int原创 2021-10-14 10:37:35 · 62 阅读 · 0 评论 -
2021.10.13打卡
412. Fizz Buzz思路:模拟class Solution {public: vector<string> fizzBuzz(int n) { vector<string> res(n); for(int i=0;i<n;i++){ res[i]=proc(i+1); } return res; } string proc(int n){原创 2021-10-13 18:09:56 · 59 阅读 · 0 评论 -
2021.10.12打卡
29. 两数相除思路:类二分查找由于不能使用乘法运算符,使用倍增的方法实现乘法。由于负数的范围是[-2^31,0],比正数范围大,所以将除数和被除数转为负数,由于2个较大的数相加A+B<C会导致溢出,所以采用减法A<C-B进行判断。使用数组存储计算过的倍乘数,可以降低时间复杂度class Solution {public: int divide(int dividend, int divisor) { // 考虑被除数为最小值的情况 if (d原创 2021-10-13 18:09:24 · 68 阅读 · 0 评论 -
2021.10.11打卡
273. 整数转换英文表示方法一:递归class Solution {public: vector<string> singles = {"", "One", "Two", "Three", "Four", "Five", "Six", "Seven", "Eight", "Nine"}; vector<string> teens = {"Ten", "Eleven", "Twelve", "Thirteen", "Fourteen", "Fifteen", "原创 2021-10-11 21:08:07 · 103 阅读 · 0 评论 -
2021.10.10打卡
441. 排列硬币个人思路:模拟class Solution {public: int arrangeCoins(int n) { int i=1,sum=0; while(sum<n){ n-=i; if(n<0) return i-1; else if(0==n) return i; el原创 2021-10-10 20:19:50 · 102 阅读 · 0 评论 -
2021.10.9打卡
352. 将数据流变为多个不相交区间个人思路:模拟插入使用vector存储插入的数字。addNum使用二分查找插入,getIntervals遍历数组,temp数组存储连续数字,如果当前值是之前值+1,那么插入temp,否则生成临时数组{temp.front(),temp.back()},插入结果数组,然后清空数组temp继续遍历。class SummaryRanges {public: SummaryRanges() { } void addNum(int val原创 2021-10-09 20:38:43 · 77 阅读 · 0 评论 -
2021.10.8打卡
187. 重复的DNA序列个人思路:哈希表class Solution {public: vector<string> findRepeatedDnaSequences(string s) { vector<string> res; if(s.size()<10) return res; unordered_map<string,int> st; for(int i原创 2021-10-08 14:19:29 · 55 阅读 · 0 评论 -
2021.10.7打卡
434. 字符串中的单词数思路:简单模拟可以从前向后遍历字符串s,如果是空格跳过,对于非空格字符,则在遍历完一个完整单词后进行一次计数。class Solution {public: int countSegments(string s) { int count = 0; for(int i=0;i<s.size();i++){ if(s[i]==' ')continue; while(i<s.siz原创 2021-10-07 16:18:31 · 56 阅读 · 0 评论 -
2021.10.6打卡
414. 第三大的数思路:有限变量+遍历题目要求第三大的数,使用3个指针表示前3大的数a,b,c,使用指针可以避免设置初始值,然后对数组进行遍历,如果:if(a == nullptr || *a < num) c=b,b=a,a= &numelse if(a != nullptr && num < *a && (b == nullptr || *b < num)) c = b, b = &numelse if(b!=nullptr原创 2021-10-06 16:58:31 · 67 阅读 · 0 评论 -
2021.10.5打卡
284. 窥探迭代器思路:C++中已实现方法next和hasnext,主要实现peek方法,。使用flag标识迭代器是否有剩余元素,使用nextElement存储迭代器下一个元素。/* * Below is the interface for Iterator, which is already defined for you. * **DO NOT** modify the interface for Iterator. * * class Iterator { * struct Dat原创 2021-10-05 10:36:25 · 71 阅读 · 0 评论 -
2021.10.4打卡
482. 密钥格式化思路:模拟class Solution {public: string licenseKeyFormatting(string s, int k) { string ans; int cnt=0; for(int i=s.size()-1;i>=0;--i){ if(s[i]!='-'){ cnt++; ans.push_back(t原创 2021-10-05 10:35:55 · 66 阅读 · 0 评论 -
2021.10.3打卡
166. 分数到小数思路:模拟除法class Solution {public: string fractionToDecimal(int numerator, int denominator) { long numeratorLong = numerator, denominatorLong = denominator; if(numeratorLong % denominatorLong == 0) return to_string(原创 2021-10-03 22:39:14 · 65 阅读 · 0 评论 -
2021.10.2打卡
405. 数字转换为十六进制数思路:位运算题目要求将给定的整数转换为16进制,由于一位16进制数对应四位二进制数,因此32位有符号数的16进制有8位。将num的二进制数按照四位一组分为8组,依次将每一组转换为对应的16进制数,即可得到num的16进制数。将每一组转换为16进制数的做法如下:将(num>>(4*i))&0xf得到的值,如果[0:9],数字本身是16进制数。如果[10:15],需要转换为a到f的对应字母。要考虑前导0,如果num为0,返回0.否则从第一个不是0的值开原创 2021-10-02 21:04:35 · 110 阅读 · 0 评论 -
2021.10.1打卡
1436. 旅行终点站个人思路:哈希表遍历并将所有的cityA加入哈希表,然后再次遍历所有的cityB,如果cityB不在哈希表中,则是答案。class Solution {public: string destCity(vector<vector<string>>& paths) { unordered_set<string> st; for(auto& p:paths){ st.i原创 2021-10-01 19:39:11 · 76 阅读 · 0 评论 -
2021.9.30打卡
223. 矩形面积个人思路:计算重叠面积两个矩形覆盖的面积等于两个矩形的面积之和减去重叠部分面积。class Solution {public: int computeArea(int ax1, int ay1, int ax2, int ay2, int bx1, int by1, int bx2, int by2) { int x1=max(ax1,bx1),x2=min(ax2,bx2),y1=max(ay1,by1),y2=min(ay2,by2);原创 2021-10-01 19:38:35 · 64 阅读 · 0 评论 -
2021.9.29打卡
517. 超级洗衣机个人思路官方题解:贪心首先,计算洗衣机每个桶的平均值,如果无法求平均值返回-1。然后,计算每个洗衣机与平均值的差值,为正表示需要移出,为负表示需要移入。考虑前i个洗衣机差值之和,大于0表示前i个洗衣机需要向后面的洗衣机移出差值的衣服,小于0表示前i个洗衣机需要移入差值的衣服。还要考虑前i个洗衣机内存在较大衣服的洗衣机,除了需要向后面洗衣机移出衣服,还要向前i个洗衣机内部移动衣服。取两者最大值为答案class Solution {public: int findM原创 2021-10-01 19:38:03 · 316 阅读 · 0 评论 -
2021.9.28打卡
437. 路径总和 III个人思路:深度优先遍历遍历每个节点,以该节点向下的路径有几种满足条件。递归遍历每个节点的所有可能路径,将这些路径数加起来返回结果。pathSum:该节点为起始点(不一定从该点出发)的路径满足条件数目getSum:该节点为根节点的路径满足条件数目class Solution {public: int pathSum(TreeNode* root, int targetSum) { if(!root) return 0;原创 2021-10-01 11:48:02 · 61 阅读 · 0 评论 -
2021.9.27打卡
639. 解码方法 II个人思路官方题解:动态规划对于给定的字符串s,分2种情况:第一种情况是使用1个字符,即s[i] 进行解码,那么如果s[i]==’*’, 对应[1:9]中任意一种解码,有九种方案,状态转移方程为:f [i] = f[i-1] * 9如果s[i]==‘0’,那么无法解码。状态转移方程为:f[i] = 0如果s[i]>=‘0’&&s[i]<=‘9’,对应1种解码。状态转移方程为:f[i]= f[i-1] * 1第二种情况是使用2个字符,即原创 2021-10-01 11:47:21 · 67 阅读 · 0 评论 -
2021.9.26打卡
371. 两整数之和个人思路:a^b表示无进位a与b相加结果(a&b)<<1表示a与b相加的进位结果注意,在C++中,赋给带符号整型一个超出其表示范围的值,结果是undefined;无符号整型表示一个超出范围的值时对数值总数取模的余数。因此,使用无符号整型防止溢出。class Solution {public: int getSum(int a, int b) { while(b!=0) { unsigned i原创 2021-09-30 21:46:27 · 76 阅读 · 0 评论 -
2021.9.25打卡
583. 两个字符串的删除操作个人思路:二维动态规划class Solution {public: int minDistance(string word1, string word2) { int n1=word1.size(),n2=word2.size(); vector<vector<int>> dp(n1+1,vector<int>(n2+1,0)); dp[0][0]=0; for(原创 2021-09-30 21:41:42 · 63 阅读 · 0 评论 -
2021.9.24打卡
430. 扁平化多级双向链表个人思路:遍历当前节点,如果当前节点有child,递归遍历child节点,然后将处理后的child连接到当前节点的next节点,在将当前节点的next节点连接到child节点的末尾class Solution {public: Node* flatten(Node* head) { Node* cur=head; while(cur!=nullptr){ if(cur->child!=nullptr){原创 2021-09-30 21:40:37 · 177 阅读 · 0 评论