自定义博客皮肤VIP专享

*博客头图:

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

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

博客底图:

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

栏目图:

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

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+
  • 博客(43)
  • 收藏
  • 关注

原创 滑动窗口系列(单序列双指针)9/9

在 [2,6,4,8,10,9,15] 中,我们可以看出最后一个不符合升序的数字是9,第一个不符合升序的数字是6。2.当不相等的时候,要判断typed.charAt(right)==typed.charAt(right-1),左侧正常序列的结束点:主要不出现左侧数字大于min,如果大于就要更新(此时更新的点是结束点)你只需要对 [6, 4, 8, 10, 9] 进行升序排序,那么整个表都会变为升序排序。2.1:如果碰到的是L,i<j;如果它对应的可能是你的朋友的名字(其中一些字符可能被长按),那么就返回。

2024-09-09 14:34:20 252

原创 滑动窗口系列(背向双指针)9/8

因为题目中要求子数组的两个端点需要满足i<=k<=j;然后分别向两边移动;我们的目的是得到最大的分数,即:min*(right-left+1);最优子数组的左右端点下标是 (1, 5) ,分数为 min(4,3,7,4,5) * (5-1+1) = 3 * 5 = 15。1.如果nums[left]>nums[right]的,那我们移动左指针。2.如果nums[left]<=nums[right]的,那我们移动右指针,并且更新minR;3.如果left或者right某一个到头了,那我们就更新另一边。

2024-09-08 12:23:01 514

原创 滑动窗口系列(同向双指针)/9.7

2.如果能量够的话,就换积分(这样是最划算的);其他情况就直接break(因为你的积分也不够,能量也不足以换取积分)贪心策略:如果我们使用tokens[i]值小的令牌换取积分。给定一个数组tokens[],里面装了下标为i的令牌的值,并且给定一个power,表示你的能量;相向双指针比较复杂,因为会有相同的数的情况被忽略掉。如果你的power>token[i]的,你可以利用power换取一个积分;如果红色的位置越多,那么剩余部分判断回文串的长度就小了。第一个函数中的||,是拿a还是b的前缀就行匹配。

2024-09-07 14:46:31 639

原创 滑动窗口系列(相向双指针)/9.6

从左往右遍历数组,当滑动窗口的长度==k的时候,如果此时相差值的和是更小的。最强值比较的规则为:和中位数的差值越大的最强。如果差值相同,大于中位数的强。因为要找到k个最接近的元素,所以要删除掉len-k个,那么删除掉哪些元素呢?为数组的中位数,只要满足下述两个前提之一,就可以判定。我们可以先排序,然后相向双指针,依次和中位数进行比较。因为元素的数目是固定的,所以滑动窗口的长度也是固定的。如果目标值x更接近右边,那么左边就要多删除一点。直到删除后的right-left+1==k。又因为数组是一个非递减的。

2024-09-06 13:03:51 441

原创 滑动窗口序列(单序列双指针)9/5

1.本来试图使用int max ,int min来记录滑动窗口中的最大值和最小值,然后发现当窗口左移的时候,最大值和最小值无法更新。返回其中最长的子串的长度。1.首先找到该字符重复字串1,遇到不同的字符停止,记重复子串的长度为:len1,停止时的下标为:j。大小为 2 的不间断子数组:[5,4], [4,2], [2,4]。大小为 1 的不间断子数组:[5], [4], [2], [4]。如果字符串中的所有字符都相同,那么这个字符串是单字符重复的字符串。大小为 3 的不间断子数组:[4,2,4]。

2024-09-05 14:29:24 639

原创 滑动窗口系列(不定长滑动窗口长度)9/4

使用滑动窗口的思路,当右边界增大后,仍然满足条件的时候,此时增加的有效答案有:right-left+1.为什么呢?然后左边界移动,移动的时候数量要改变,如果数量==0,种类也要改变。8 个乘积小于 100 的子数组分别为:[10]、[5]、[2]、[6]、[10,5]、[5,2]、[2,6]、[5,2,6]。完全子数组有:[1,3,1,2]、[1,3,1,2,2]、[3,1,2] 和 [3,1,2,2]。因为当更新右边界后,可能该滑动窗口不是满足条件的,所以在更新左边界之后,再计算有效的子数组。

2024-09-04 12:28:49 1204

原创 滑动窗口系列(不定长滑动窗口长度)9/3

剩下的部分可能在一个数组中,也可能分布在两个数组中,所以用剩下的target(target-sum(nums))在长度为2*nums.length的数组中去找最短子数组。给定一个数组nums,nums中的元素按照顺序循环放在infinite_nums中,然后在infinite_nums中找到一个最短子数组,和为target。2.当不替换子串中字母出现的次数是<=k次的,说明替换子串是符合题意的;不替换子串中某个字母出现的次数一定要<=k次,因为如果出现的次数>k次,那么就要出现在替换子串中了。

2024-09-03 20:47:52 554

原创 滑动窗口系列(不定长滑动窗口长度) 9/2

移动right的时候,需要更新costK,costK=(nums[right]-nums[right-1])*(right-left);逆向思维就是:题目中是否存在一段子串满足字符出现最多的次数为:count[0]-k,count[1]-k,count[2]-k。每次遍历到一个字符,就将出现的次数-1(还可以出现多少次),如果出现<0的情况,左边界就要改变了。每次操作的时候,移除左边和右边的元素,使得移除元素之和=x。给定一个数组nums,求子数组中删除k个元素后,所有元素都相等,返回相同元素的最大个数。

2024-09-02 13:22:16 1174

原创 滑动窗口系列(不定长滑动窗口长度) 9/1

给定一个字符串 ,请你找出其中不含有重复字符的 最长子串 的长度。输入: s = "abcabcbb"输出: 3 解释: 因为无重复字符的最长子串是 "abc",所以其长度为 3。思路:不定长的滑动窗口长度,其中windowSize=无重复字符的最长字串的长度;那么如何得到最长字串的长度?使用哈希表+while循环遍历如果遍历到的字母在哈希表中存在,此时字串中出现重复字符;此时我们就要移动left改变滑动窗口的左边界;使得哈希表中不再出现s.charAt(right);因为新的字符串的开始一

2024-09-01 13:04:48 666

原创 滑动窗口系列(定长滑动窗口长度)8/31

元素。

2024-08-31 13:22:01 764

原创 滑动窗口系列(定长滑动窗口长度) 8/30

k>0,开始进行循环遍历数组中的每一个数字,当right-left+1==k或者right+len-left+1==k的时候,res[(left-1)%k]==sum,循环的条件为index<nums.length+k-1(要使数组上每一个位置都有新的和)对数组遍历循环,当窗口的长度==k的时候,判断平均值是否大于等于阈值,如果大于等于res++;如果k>0,数组中下标为index的值为后k位数字(>nums.length-1就返前来)的和;给定一个nums数组,计算中所有整数数对中 数位差的个数之和;

2024-08-30 22:42:48 655

原创 算法学习day32

2.如果遍历到的数字可以和放一个数字构成一个有效的大写字母的ASCII值,是对dp[i+1]有用的,(这个有用是指多了dp[i-1]种分割方法)那么dp[i+1]+=dp[i-1];现在1有与3,5相乘的资格,2有与2,3,5相乘的资格,但是2×3和2×5是没必要比较的,因为有比它更小的1可以同3,5相乘,所以我们只需要比较1×3,1×5,2×2。即n=2*x+3*y+5*z。如果nums[i]==nums[i-1]&&nums[i-1]==nums[i-2] 那么dp[i]+=dp[i-1]+1;

2024-08-12 18:10:44 1077

原创 算法学习day31(动态规划)

在不触动警报装置的情况下。

2024-08-08 21:50:23 1241

原创 算法学习day30

/要求最小值,dp[i-1][1](下标到i-1的最大值)*nums[i]dp[i][0]=Math.min(nums[i],dp[i-1][0]*nums[i]);//要求最大值,dp[i-1][0]*nums[i]2.递推公式:dp[i]=Math.max(dp[i],Math.max(i*j,i*dp[j]));

2024-08-07 17:15:11 935

原创 算法学习day29

此时选择mid>=k,刚好是right=mid;如果选择mid<=k,那么left会+1;

2024-08-05 21:03:20 935

原创 算法学习day28

举个例子理解一下:假如按照升序排列后为:(5,5),(6,6),(7,2)(7,1)(8,3),(9,4)。4.envelopes[i][1]=1, 1小于6,给1寻找合适的位置,1<2,因此tails[0]=1;5.envelopes[i][1]=3,3小于6,给3寻找合适的位置,3<6,因此tails[1]=3;2.envelopes[i][1]=6, 6大于5,tails[1]=6,size=2;1.envelopes[i][1]=5, 集合为空,tails[0]=5 size=1;

2024-08-03 21:43:16 1800

原创 算法学习day27

int left=0;else{//找到target寻找最左边和最右边break;return res;

2024-08-02 20:12:28 941

原创 算法学习day26(滑动窗口)

其实就是在不断寻找最长滑动窗口长度的过程。滑动窗口的大小只能增大不能减小。1.找中间值3。分成两段:1->2\ 3->4->52.中间值作为新的头结点反转5->4->3左边拿一个 右边拿一个。

2024-08-01 21:52:14 795

原创 算法学习day25

当遇到 map.containsKey(s.charAt(right))的时候,说明遇到重复子串了,此时更新一下当前子串的长度,然后将左边起始位置右移,继续遍历。要判断s2是否包含s1的排列,顺序不一样也算包含,直观的想法:就是将s1所有的排序都列出来,然后判断在s2中是否存在,存在一种就返回true;两道题的做法都是类似的,先固定一个起始位置,然后在剩余的范围里面使用双指针进行遍历(前提是要先对数组进行排序),遍历的过程中找符合条件的结果。使用双指针进行遍历,每次左边固定,右边寻找无重复子串的最长子串。

2024-08-01 08:18:57 1297

原创 算法学习day24

1.求最多数组的个数,map中的value存放次数2.求最长子数组,map中的value存放最小下标。

2024-07-30 21:29:17 1077

原创 算法学习day23

给你链表的头节点head,每k个节点一组进行翻转,请你返回修改后的链表。

2024-07-29 21:36:59 1131

原创 算法学习day22

首先要计算出链表的长度length,然后计算出新头节点前一个的位置index;在长度为n的结点数组中,遍历n次,找到最小的结点,然后放到新链表的下一个。2.如果有子节点,下一个节点就是如何规则的孩子节点们...,孩子节点们的下一个节点是该节点之前的下一个节点。你会得到一个双链表,其中包含的节点有一个下一个指针、一个前一个指针和一个额外的。如果有子节点的话,下一个节点就是子节点,如果没有子节点,下一个节点就是next。找到翻转后新的头节点,然后将新头节点之前的结点都放到新节点中最后一个结点之后。

2024-07-27 22:03:11 815

原创 算法学习day21

2.栈顶的元素不为空,说明以start为起点的左括号还没有到栈顶元素,目前为止,左括号是>右括号的,此时也找到可能成为最长有效括号的串了。1.栈顶的元素为空,说明以start为起点的左括号是

2024-07-26 21:35:18 967

原创 算法学习day20

颠倒给定的 32 位无符号整数的二进制位。输入的二进制串表示无符号整数43261596因此返回 964176192,其二进制表示形式为。

2024-07-25 21:11:40 1354

原创 算法学习day19

如果不相等,dp[i][j]=Math.max(dp[i][j-1],dp[i+1][j])如果j-i>1,dp[i][j]是否是回文子串需要看dp[i+1][j-1];i+j+1是根据i,j的大小决定的,并且表示的是multi个位上的数字。就是判断每一个字符串是不是其它字符串的子串,如果是的话,该字符串的最长特殊序列的长度为0;,如果第一个字符和参数的第一个字符相等,则以第二个字符和参数的第二个字符做比较,以此类推,直至比较的字符或被比较的字符有一方结束。

2024-07-24 21:37:23 887

原创 算法学习day18(字符串)

然后根据所给的字符串进行判断,如果charAt(i)所对应的数值是小于charAt(i+1)的,这说明是两个字母组在一起表示的。如何判断连续相同的数字(nums[i]==nums[i+1]&&i+1<nums.length)那么直接分割就行,然后对比每一个. .之间的大小,Integer.parseInt(ver1[i])已经是去掉前置0的情况了。\\是转义字符,|代表或的意思。字符串 s 有六个子字符串 ("z", "a", "b", "za", "ab", and "zab") 在 base 中出现。

2024-07-20 21:29:28 915

原创 算法学习day17(字符串)

通过String类的split方法将空格删去,然后计算出每一个单词的size。题目中要求的是:具有相同数量0和1的非空连续子字符串的数量。因此每一对相邻二进制串的拥有相同数量的0,1的xxx的数量是Math.min(0数量,1数量);返回的结果字符串中,单词间应当仅用单个空格分隔,且不包含任何额外的空格。key:String(按照字符排序后的字符串),value:字母一样的集合。,你需要反转字符串中每个单词的字符顺序,同时仍保留空格和单词的初始顺序。的非空(连续)子字符串的数量,并且这些子字符串中的所有。

2024-07-20 08:26:16 698

原创 算法学习day16——刷题(仍然是数组)

注意的点:活细胞的个数是周围八个格子中的个数,不包含自身。Set<Integer>zeroCol,(Set集合中的元素不能重复也没关系,因为如果碰到两个第0列,都是为了将第0列的元素置为0);如果一个单元格周围存在单元格缺失的情况,则计算平均灰度时不考虑缺失的单元格(即,需要计算红色平滑器中 4 个单元格的平均值)。但是局部的顺序是反的。的过滤器,用于对图像的每个单元格平滑处理,平滑处理后单元格的值为该单元格的平均灰度。左下三角里:B[1]和右上三角里:B[1] 乘起来就是除了该元素以外,其他元素的乘积。

2024-07-18 21:46:40 1322

原创 算法学习day15——刷题(数组)

如果有正有负,最大值会在三正/两负一正中出现,即Math.max(nums[size]*nums[size-1]*nums[size-2],nums[0]*nums[1]*nums[size]);综上所述,返回的结果为Math.max(nums[size]*nums[size-1]*nums[size-2],nums[0]*nums[1]*nums[size]);然后遍历数组,如果出现了nums[i]!nums[i]

2024-07-18 09:13:22 877

原创 算法学习day14(动态规划——子序列问题/单调栈)

首先我们可以得知,当nums[i]大于时,中间的是nums[stack.peek()],右边的是nums[i],左边的是栈顶元素的下一个元素。2.dp[i][j]=dp[i+1][j-1]+2(相等的情况下.s.charAt(i)==s.charAt(j));在dp[i+1][j-1]的基础上。dp[i][j]=Math.max(dp[i+1][j],dp[i][j-1]) (不相等的情况下,就要移动i,j)

2024-07-17 09:10:56 925

原创 算法学习day13(动态规划)

不持有股票:dp[i][0]=Math.max(dp[i-1][0],dp[i-1][1]+prices[i]);持有股票:dp[i][1]=Math.max(dp[i-1][1],-prices[i]);

2024-07-15 21:42:05 1331 4

原创 算法学习day12(动态规划)

有一堆石头,用整数数组stones表示。其中stones[i]表示第i块石头的重量。每一回合,从中选出任意两块石头,然后将它们一起粉碎。假设石头的重量分别为x和y,且x

2024-07-14 18:57:27 1311 1

原创 算法学习day11

一支弓箭可以沿着 x 轴从不同点地射出。在坐标x处射出一支箭,若有一个气球的直径的开始和结束坐标为startend, 且满足end,则该气球会被。2气球可以用2支箭来爆破:-在x = 6处射出箭,击破气球[2,8]和[1,6]。-在x = 11处发射箭,击破气球[10,16]和[7,12]。思路:按照左边界从小到大排列。出现的情况:1.points[i][0]>points[i-1][1]:第二个气球的左边界大于第一个气球的右边界(没有交集),此时射箭的数量就要++

2024-07-11 23:16:17 1724

原创 算法学习day10(贪心算法)

贪心算法

2024-07-10 22:34:42 2401

原创 算法学习day09(N皇后/解数独)

如果为空,然后进行for循环判断1-9,哪一个数字是合适的。满足一行就会往下递归一次,递归一次row就会加一次,直到row==n,(row是从0->n-1的),就可以把chessboard转为集合放到结果中了,单层递归逻辑:循环,每一个点(x,y)都要判断一下,如果满足n皇后规则,就递归到下一行,继续选取某个点,如果满足,继续下一行,直到(row==n);终止条件:startIndex>=nums.length(nums.length-1的时候是最后一个节点还要进去处理,只有当>=的时候才终止);

2024-07-09 19:22:00 932

原创 算法学习day08(回溯算法)

不使用标记的方法是:if(i>startIndex&&candidates[i]==candidaes[i-1]) 要求i>startIndex,在第一遍的时候都不会满足i>startIndex,eg:1,1,2 在第一个1的时候 不会满足这个条件的.注意:一定要有去重操作:当i>startIndex,并且遇到candidates[i]==candidates[i-1],在下标为i-1的时候,已经遇到过所有的情况,在下标为i的时候就不需要考虑了。

2024-07-09 08:34:18 1108

原创 算法学习day07(二叉树完结)

代表着:left==right的时候,递归就会终止,我right是左闭右开的,传入right的时候为,nums.length。思路:使用双指针,递归右子树,然后每一个节点的val值等于root.val+pre.val。顺序为右中左,所以先递归右子树,然后root.val+=pre.val,pre=root。这里用一个TreeNode pre来表示上一次遍历到的节点,当while条件不符合的时候,root就会为空,此时pre刚好是最后一个叶子节点。递归找到要添加到子节点的位置,如果==null,说明找到了。

2024-07-06 17:46:07 556

原创 算法学习day06(二叉树)

灵活的解法:顶一个TreeNode pre 指向前一次遍历的节点,要求前一次遍历的节点要比现在的根节点的值要小 private TreeNode pre=null。叶子节点if(node.left==null&&node.right==null)return targetSum==0;2.确立递归函数的终止条件:root==null root==q||root==p 直接返回root。1.如果root==p||root==q||root==null 就不用判断了 直接返回root。

2024-07-05 22:39:18 810

原创 算法学习day05

null)depth++,traversal(root.left,depth),depth-- 要做回溯操作。2.终止条件 (node==null) (node.left==null&&node.right==null) return 0;2.递归函数的终止条件:当递归到叶子结点的时候if(node.left==null&&node.right==null)2.递归函数的终止条件:(root.left==null&&root.right==null)return;在进行左递归的时候,如果遇到左子树!

2024-07-04 23:12:31 414

原创 算法学习day04(二叉树)

因此按照卡尔哥的思想。前序遍历:利用栈,将根节点push进去,然后弹出根节点(完成了中),然后将它的右结点、左节点依次入栈。此时在栈顶的元素就是左节点,然后再将左节点pop掉(完成了左),继续将左节点的左右节点入栈。前/后序遍历处理的思路都是一样的(因为前序遍历,经过那一个结点的时候,就会将节点值输出,后序遍历可以由前序遍历通过一系列的转换得到,但是中序遍历,每次都要遍历到最左边,然后菜输出节点值。大致思路:在遍历每一层结点的时候,如果遇到一个结点没有左右子节点,那么从根节点到这个结点的距离就是最小高度。

2024-07-03 22:42:01 1391

空空如也

空空如也

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

TA关注的人

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