首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往
您找到你想要的搜索结果了吗?
是的
没有找到

大厂算法面试:使用移动窗口查找两个不重叠且元素和等于给定值的子数组

根据”老朽“多年在中国IT业浸淫的经验,我发现无论大厂还是小厂,其算法面试说难也不难。难在于算法面试的模式都是在给定网站上做算法题,90分钟做三道。我自认个人水平在平均线以上,但通过多次尝试发现,要在90分钟内完成给定算法题非常困难,这还是在我有过多年算法训练的基础上得出的结论,特别是这些题目往往有一些很不好想到的corner case,使得你的代码很难快速通过所有测试用例,我们今天要研究的题目就属于有些特定情况不好处理的例子。此外“不难”在于,很多公司的面试算法题其特色与整个行业类似,那就是缺乏原创,中国公司90%以上的面试算法题全部来自Leetcode,因此刷完后者,甚至把后者那五百多道题”背“下来,你基本上能搞定,国内仿造hackerrank的牛X网,其题目就是这个特点。

02

JS学习笔记 (四) 数组进阶

1、数组是值的有序集合。每个值叫做一个元素,而每个元素在数组中的位置称为索引,以数字表示,以0开始。 2、数组是无类型的。数组元素可以是任意类型,并且同一个数组中的不同元素也可能有不同的类型。数组的元素可以是对象或其它数组。 3、数组是动态的,数组长度可长可短。在创建数组时无须声明一个固定的大小或者在数组大小变化时无须重新分配空间 4、数组可以是稀疏的。数组元素的索引不一定是连续的,它们之间可以有空缺,每个数组都有一个length属性,针对非稀疏数组,该属性就是数组元素的个数,针对稀疏数组,length比实际元素个数要大。 5、JavaScript数组是JavaScript对象的特殊形式。数组索引可以认为是整数的属性名。 6、数组继承自Array.prototype中的属性。它定义了许多的方法,它们对真正的数组和类数组对象都有效。如,字符串、arguments等。

01

子集 II

在本质上是一个组合问题,以一个长度为4的数组[1, 2, 3, 4]组合2个值为例,每两个组合一个数组可取1组合其数组中之后的值,2与其数组中之后值,3与其数组中之后的值,4与其数组中之后值,即[1, 2]、[1, 3]、[1, 4]、[2, 3]、[2, 4]、[3, 4],按照这个思路就需要取出给定数组的1 ~ length长度的组合,这是在给定的数组中没有重复值的情况下,题目中要求会有重复的值,所以在加入的时候我们就需要对其进行操作,首先我们对其进行排序,这样重复的值就会在一起,之后判定对于给定目标长度的数组重复的值只加入一个即可。首先定义目标数组,空数组是所有的数组的子集,所以将空数组置入,之后取得传入的数组的长度n,如果长度为0则直接返回目标数组,之后对其进行排序,之后定义深度递归遍历,首先进行剪枝,如果当前tmp数组的大小为s,未确定状态的区间[cur,n]的长度为t,如果s + t < limit,那么即使t个都被选中,也不可能构造出一个长度为limit的序列,故这种情况就没有必要继续向下递归,之后判断递归深度如果与limit相等则直接将tmp数组置入目标数组并返回,之后定义一个循环,在这里我们要处理数字重复的情况,先前已经对其进行排序,所以每次递归后的循环对于数组中重复的值,我们只将第一个置入数组,其他的都忽略,从cur开始到n进行递归取值,将tmp数组与cur构建一个新数组传递到下一个递归中,之后定义一个循环取得要取得的子集的数组长度,启动递归初始化cur为0,深度deep为0,tmp为一个空数组,limit为i+1,递归完成后返回目标数组即可。

02
领券