logo
publist
写文章

简介

该用户还未填写简介

擅长的技术栈

可提供的服务

暂无可提供的服务

【优选算法】(第五篇)

果继续像⽅法⼀⼀样,重新开始统计第⼆个元素( left2 )往后的和,势必会有⼤量重复的计算(因为我们在求第⼀段区间的时候,已经算出很多元素的和了,这些和是可以在计算下次区间和的时候⽤上的)。让滑动窗⼝满⾜:从 i 位置开始,窗⼝内所有元素的和⼩于 target (那么当窗⼝内元素之和。断是否满⾜条件并更新结果(因为左端元素可能很⼩,划出去之后依旧满⾜条件)▪ 如果窗⼝内元素之和不满⾜条件: ri

文章图片
#算法#数据结构#java +3
【优选算法】(第二十四篇)

left[cur1]>right[cur2],由于两个数组都是升序的,那么我们可以断定,此刻left数组中[cur1,2]区间内的3个元素均可与right[cur2]的元素构成逆序对,因此可以累加逆序对的数量ret+=3,并且将right[cur2]加⼊到辅助数组中,cur2++遍历下⼀个元素。left[cur1]==right[cur2],因为right[cur2]可能与left数组中往后的元素

文章图片
#算法#数据结构#java +4
【优选算法】(第十二篇)

在传递给函数之前, nums 在预先未知的某个下标 k(0 <= k < nums.length) 上进⾏了旋转,使数组变为 [nums[k], nums[k+1], ..., nums[n-1], nums[0], nums[1],通过图像我们可以发现, [A,B] 区间内的点都是严格⼤于 D 点的值的, C 点的值是严格⼩于 D 点的值的。例如, [0,1,2,4,5,6,7] 在下标 3 处

文章图片
#算法#数据结构#java +4
【优选算法】(第七篇)

可以利用left和right双指针,此时需要一个统计数kinds去记录这个区间水果的种类,当kinds不超过2时right向右进行移动,便是利用hash思想,如果说超过便停止,此时移动left,这是只需要用双指针将整个数组遍历一遍(这里用数组不用hash是因为题目给的范围用数组会更高效,范围比较小如果用hash反而一直进出,时间复杂度会变高),那么整个题的时间复杂度便非常可观!然⽽,农场的主⼈设定

文章图片
#算法#java#c++ +4
【优选算法】(第八篇)

么)abcdef),)abefcd),)cdabef),)cdefab),)efabcd),和)efcdab)都是串联⼦串。输⼊:s=)wordgoodgoodgoodbestword),words=[)word),)good),)best),)word)]输出:[]输⼊:s=)barfoofoobarthefoobarman),words=[)bar),)foo),)the)]输出:[6,9,1

文章图片
#算法#java#c++ +4
【优选算法】(第二十五篇)

⼤思路与求逆序对的思路⼀样,就是利⽤归并排序的思想,将求整个数组的翻转对的数量,转换成三部分:左半区间翻转对的数量,右半区间翻转对的数量,⼀左⼀右选择时翻转对的数量。但是在我们归并排序的过程中,元素的下标是会跟着变化的,因此我们需要⼀个辅助数组,来将数组元素和对应的下标绑定在⼀起归并,也就是再归并元素的时候,顺势将下标也转移到对应的位置上。这⼀道题的解法与求数组中的逆序对的解法是类似的,但是这⼀道

文章图片
#算法#数据结构#java +4
【优选算法】(第二十一篇)

第⼀项是数字1描述前⼀项,这个数是1即“⼀个1”,记作"11"描述前⼀项,这个数是11即“⼆个1”,记作"21"描述前⼀项,这个数是21即“⼀个2+⼀个1”,记作"1211"描述前⼀项,这个数是1211即“⼀个1+⼀个2+⼆个1”,记作"111221"要描述⼀个数字字符串,⾸先要将字符串分割为最⼩数量的组,每个组都由连续的最多相同字符。countAndSay(4)=读"21"=⼀个2+⼀个1="1

文章图片
#算法#数据结构#leetcode +4
【优选算法】(第十五篇)

想知道有多少个「以 i 为结尾的和为 k 的⼦数组」,就要找到有多少个起始位置为 x1, x2, x3... 使得 [x, i] 区间内的所有元素的和为 k。那么 [0, x] 区间内的和是不是就是。• 设 [0, x - 1] 区间内所有元素之和等于 a , [0, i] 区间内所有元素的和等于 b ,可得。sum[i] - k。设 i 为数组中的任意位置,⽤ sum[i] 表⽰ [0, i]

文章图片
#算法#数据结构#java +3
【优选算法】(第二篇)

根据上述的题⽬分析,我们可以知道,当重复执⾏ x 的时候,数据会陷⼊到⼀个「循环」中。⽽「快慢指针」有⼀个特性,就是在⼀个圆圈中,快指针总是会追上慢指针的,也就是说他们总会相遇在⼀个位置上。由于上述两种情况只会出现⼀种,因此,只要我们能确定循环是在「情况⼀」中进⾏,还是在「情况⼆」中进⾏,就能得到结果。为了⽅便叙述,将「对于⼀个正整数,每⼀次将该数替换为它每个位置上的数字的平⽅和」这⼀个操作记为

文章图片
#c++#java#算法 +1
【优选算法】(第一篇)

这个⽅法是往后我们学习「快排算法」的时候,「数据划分」过程的重要⼀步。如果将快排算法拆解的话,这⼀段⼩代码就是实现快排算法的「核⼼步骤」。

文章图片
#算法
到底了