工作后还要刷力扣
辛苦打工人
我是大龙啊
这个作者很懒,什么都没留下…
展开
-
763. 划分字母区间
763. 划分字母区间解析很容易想到要找到字符的最远位置。贪心法原创 2022-05-16 23:02:47 · 126 阅读 · 0 评论 -
2021-10-18 力扣3-无重复字符的最长子串
初看此题是要找子串,那一般使用滑动窗口,问题在于如何记录已经出现的和判断当前字符是否跟前面的重复了,以及重复了后怎么处理。对于问题一,如何记录,我们可以采用数组的方式记录。对于问题二,如何判断该字符是否出现过,只要判断当前字符是否在问题一中记录过即可,由于问题三中,当我们判断了该字符出现过时,那滑动窗口的左边界应该为出现过的位置的后一个位置,所以问题一中数组记录的最好是字符出现的位置。int lengthOfLongestSubstring(char * s){ int locatio.原创 2021-10-18 23:28:01 · 84 阅读 · 0 评论 -
2021-10-14 力扣616 给字符串添加加粗标签
看到题目时就想到了用strstr在字符串中查找字典中的字符串,因为strstr返回的是第一次出现的首地址,所以没想好怎么去找到Index,所以就停滞了,看了答案后恍然大悟,答案写的很巧妙,用返回的地址与字符串s的首地址做差再除以CHR类型的大小。index = (sptr - targetPtr)/sizeof(char);再一个就是找到了index后如何去利用。题目中要求对于能连续的子串要连续加粗,所以可以将字典中的所有出现的字符在原串S中做好标记,用flag[len]去做标记,以便后面遍历还有..原创 2021-10-14 00:19:20 · 257 阅读 · 0 评论 -
2021-10-10 二分查找
/* 查找大于或等于target的最小值*/int Search_1(int *nums, int len, int target){ int left = 0; int right = len - 1; if (nums[right] < target) { return -1; } while (left < right) { // 大于等于向下取整 int mid = left + (right -原创 2021-10-10 16:50:19 · 66 阅读 · 0 评论 -
2021-09-26力扣424-替换后的最长重复字符
一看到最长字串长度一般都是用双指针或者滑动窗口。本题可以转换下思路,既然滑动窗口中的字符可以被替换k次,那么只要滑动窗口中的除了出现组多的那个字符外的其他字符出现的次数少于K那么窗口就可以扩大。如果大于K,那么证明// 可以转换下思路,在一个滑动窗口内,除了出现次数最多的那个外的其他字符的出现次数小于等于k,那么窗口就可以扩大int characterReplacement(char * s, int k){ int len = strlen(s); int left = 0; .原创 2021-09-26 23:56:21 · 49 阅读 · 0 评论 -
2021-09-13 力扣567-字符串的排列
bool equals(int* cnt1, int* cnt2) { for (int i = 0; i < 26; i++) { if (cnt1[i] != cnt2[i]) { return false; } } return true;}bool checkInclusion(char* s1, char* s2) { int n = strlen(s1), m = strlen(s2); ..原创 2021-09-13 23:04:51 · 51 阅读 · 0 评论 -
0906-力扣826-安排工作以达到最大收益
1.这个题第一反应就是要对难度进行排序,但是如果只对难度进行排序,那后面取收益的的时候就找不到对应的了,所以要对难度和收益进行绑定再对难度排序。2.有了单调递增的难度后,就是根据工人的能力选择对应的工作了,工人的能力要小于或等于工作的难度,次数用二分法进行优化查找,但是要注意两种情况,工人的能力小于最小难度或大于最大难度。3.此外本题没有指出难度大收益大,所以在每一项维护一个最大收益typedef struct { int diffcult; int prof; int ma.原创 2021-09-07 00:18:12 · 157 阅读 · 0 评论 -
2021-09-02
解题思路动态规划思想是希望连续的,也就是说上一个状态和下一个状态(自变量)之间有关系而且连续。公共子数组相当于子串:是连续的dp[i][j]:表示第一个数组 A 前 i 个元素和数组 B 前 j 个元素组成的最长公共子数组(相当于子串)的长度。我们在计算 dp[i][j] 的时候:若当前两个元素值相同,即 A[i] == B[j],则说明当前元素可以构成公共子数组,所以还要加上它们的前一个元素构成的最长公共子数组的长度(在原来的基础上加 1),此时状态转移方程:dp[i][j] = dp[i -.原创 2021-09-02 22:52:09 · 55 阅读 · 0 评论 -
2021-09-01 力扣165 - 比较版本号
一开始想的是逐位比较,但是需要考虑的例外比较多,考虑用strtok分割也比较麻烦。后来想到可以结合一下,只不过是用指针去分割,遇到点就比较。int compareVersion(char * version1, char * version2){ int v1Index = 0; int v2Index = 0; int v1Len = strlen(version1); int v2Len = strlen(version2); while (v1Index .原创 2021-09-01 23:34:42 · 105 阅读 · 0 评论 -
2021-08-29 剑指 Offer II 010. 和为 k 的子数组
一开始看到连续子数组就考虑用滑动窗口,滑动窗口模板如下# 滑动窗口模板left,right = 0, (0 or 1)ret = total = 0while right < len(nums): 更新total值 while 窗口内数据不满足要求 1. 更新total值 2. 收缩左边界 更新ret最大值返回 ret代码int subarraySum(int* nums, int numsSize, int k){ int res .原创 2021-08-29 23:26:50 · 116 阅读 · 0 评论 -
2021-08-17 力扣643-子数组最大平均数
遇到这种连续子数组的问题用双指针或滑动窗口是比较方便的。一个长度为n的数组,有n-k+1个连续大小的子数组,如果每次去计算则耗时太久,采用滑动窗口,不断的向右滑动,找到和最大的子数组即为答案。i > k时,sums[i] = sums[i-1] - nums[i-k] + nums[i];double findMaxAverage(int* nums, int numsSize, int k){ double sum = 0; for (int i = 0; i < k.原创 2021-08-17 23:57:35 · 64 阅读 · 0 评论 -
2021-08-11 力扣162-寻找峰值
方法一:线性扫描本方法利用了连续的两个元素 nums[j]nums[j] 和 nums[j + 1]nums[j+1] 不会相等这一事实。于是,我们可以从头开始遍历 numsnums 数组。每当我们遇到数字 nums[i]nums[i],只需要检查它是否大于下一个元素 nums[i+1]nums[i+1] 即可判断 nums[i]nums[i] 是否是峰值。可以通过分别讨论问题的全部三种可能情况来理解本方法的思路。降序排列对于降序排列,第一个元素就是峰值升序排列线性排序中一直比较num.原创 2021-08-11 23:25:53 · 71 阅读 · 0 评论 -
力扣457
这道题要好好读题,意思就是有一个环形数组,重点是这个环形数组,之前有个判断是否环形链表的题目,定义快慢指针,慢的每次走一步,快的走两步,一旦存在相等的情况,那么一定成环。本题就是在判断成环的过程中添加限制条件。/* 题目中给的是一个环形数组,环形数组,那么快慢指针是一定能相遇的,程序要判断的是如果按照题目中的限制条件去走的话能不能相遇*/int GetNextIndex(int *nums, int numsSize, int curIndex){ return (((curIndex .原创 2021-08-07 23:57:17 · 48 阅读 · 0 评论 -
2021-08-03 力扣209 长度最小子数组
做这个题真的是无语了,审错题目了,题目说的连续子数组,我一直在按非连续的去分析,导致一直再搞深搜。。。对于这种连续子数组问题,双指针是最简单的办法了。。。int minSubArrayLen(int target, int* nums, int numsSize){ int sum = 0; int left = 0; int right = 0; int resLen = INT_MAX; while(right < numsSize) { .原创 2021-08-04 00:00:23 · 49 阅读 · 0 评论 -
2021-08-02 力扣201. 数字范围按位与
看到这道题,第一反应是暴力解,但肯定会超时。。。后来想到了类似前缀和的方法res[i] = res[i-1] & num[i],分析了一下无法得到区间值。后来看了下答案,害,发现自己分析的深度太浅了。。。讨论区分析如下:只要找到前面公共的即可,后面的补0.记录工作后辛苦刷题的一天。。。...原创 2021-08-02 22:47:02 · 74 阅读 · 0 评论 -
2021-08-05 力扣809
对于这种中间有重复字母的匹配,可以顺序记录字母并且记录字母重复的个数,匹配字母如果能匹配则首先必须顺序上具有和目标字符串相同的字母顺序,其次再考虑题目中给的个数限制,如题所述,目标字符必须达到3或者3以上且比匹配字符个数大。在字母顺序相同的前提下,令目标字符串中顺序字符的个数为C1,匹配字符串中顺序字符的个数为C2,那么能匹配的情况如下,C1 == C2 —匹配C1 > C2 && C1 > 3 —p匹配C1 < C2 --不匹配bool IsMatch(C.原创 2021-08-06 00:01:56 · 59 阅读 · 0 评论