机试打卡 -14 轮转数组(数组) ①nums=nums[::-1],会改变nums的地址;nums[:]=nums[::-1],不会改变nums的地址。②数组翻转的代码 nums[:k]=nums[:k][::-1];nums[k:]=nums[k:][::-1]这种写法虽然简单,但效率不高。因为若 k 很大时,每次都需要执行。这两个操作,引入模运算可以应对k较大的情况。
机试打卡 -13 最小覆盖子串(滑动窗口) 在滑动窗口类型的问题中都会有两个指针,一个用于「延伸」现有窗口的 r 指针,和一个用于「收缩」窗口的 l 指针。在任意时刻,只有一个指针运动,而另一个保持静止。我们在 s 上滑动窗口,通过移动 r 指针不断扩张窗口。当窗口包含 t 全部所需的字符后,如果能收缩,我们就收缩窗口直到得到最小窗口。
机试打卡 -12 滑动窗口最大值(优先队列&堆) 在有些情况下,可能需要找到元素集合中的最小或者最大元素,可以利用优先队列来完成操作,优先队列ADT是一种数据结构,是一种有特殊用途的数据结构,用来在一组变化频繁(发生增删查改的频率较高)的数据集中。我的思路1:队列,每次 出队+入队,记录1个队列中的最大值索引,超时。我的思路2:建立排序队列,每次 出队+入队,采用 折半搜索,超时。官方题解:优先队列(堆),将整个数组看作是堆。
机试打卡 -11 数组的乘积(前缀和) 思路:“除自身以外的数组的乘积”可以转化为求该元素的前缀积和后缀积,即先遍历两遍数组,得到前缀积数组和后缀积数组,第三次遍历即将前缀积数组和后缀积数组按位相乘。注意:后缀suffix 需倒序排列。
机试打卡 -10 最长子串(哈希表&滑动窗口) 我的思路:首先构建列表作为滑动窗口。在遍历字符串的过程中,当出现重复字符时,删除 滑动窗口(列表) 从开头到重复字符位置的所有元素。“最长子串”,很容易想到 滑动窗口。
机试打卡 -07 盛水的容器(双指针) 假设某一时刻,water=W,选择容器的左边界索引为 i ,高度为 height[i]。那么容器至少需要 W/height[i] 的宽度才有可能突破 W 的容量上限。优化一下:当每次选择一个容器的左边界时,并不需要遍历计算之后每一条垂线充当右边界的情况。最简单粗暴的方法,两个for循环,遍历 n(n-1)/2 次,当然超时。
机试打卡 -06 异位词分组(哈希表) 比如可以通过list.append(),set.remove(),dict[‘key‘] = value对其进行修改,所以它们都是不可哈希的;②dict.values() 将字典中的所有 value 全部取出,但需要使再用 list() 或 tuple() 转换数据类型;①sorted() 函数将返回一个排序后的列表,若需要重新组合成字符串,需使用 "".join()函数。一个对象在其生命周期内,如果保持不变,就是hashable(可哈希的)。dict.keys() 同理。
机试打卡 -05 接雨水(动态规划&栈) 新柱子的 right_height 则分为两种情况,一种是 新柱子的高度不等于前一个柱子的 right_height,这种情况下则令新柱子的 right_height 直接取 前一个柱子的 right_height 即可;另一种情况则是 新柱子的高度等于前一个柱子的 right_height,即说明前一个柱子的 right_height 可能取自该根柱子,则新柱子的 right_height 取后面的柱子的最大值(数组切片) 即可。动态规划 - 复杂度分析。,有些类似递归的思想。