leetcode 第 395 场算法比赛

作者: | 更新日期:

最后一题有点难度。

本文首发于公众号:天空的代码世界,微信号:tiankonguse

零、背景

这次比赛是调休日,需要加班,所以没有参加比赛,晚上做了一下题,最后一题有点难度。

A: 排序。
B: 枚举。
C: 位运算。
D: 二分+双指针。

排名:无 代码地址: https://github.com/tiankonguse/leetcode-solutions/tree/master/contest/3/395

一、找出与数组相加的整数 I

题意:给两个数组,确定两个数组的所有元素相差 X,求这个X。

思路:两个数组排序,第一个元素的差就是整个数组的差。

二、找出与数组相加的整数 II

题意:给两个数组,第一个数组比第二个多两个元素,删除某两个元素后,两个数组满足所有元素相差 X,求最小的 X。

思路1:枚举两个元素,判断剩余的元素是否满足都相差 X。
复杂度:O(n^3)

思路2:枚举最小值,确定差值 X,判断是否有答案。
复杂度:O(n log) + O(n)

三、数组最后一个元素的最小值

题意:求构造一个数组,数组递增,所有值与运算后是 X。

思路:与运算后都是 X,说明所有元素都有 X 的二进制 1。
不考虑这些二进制 1,剩余的位合并在一起,需要递增,即为 1~n

之后把 X 的二进制插入到 n 即可。

四、找出唯一性数组的中位数

题意:给一个数组,所有子数组去重后的个数组成新的有序数组,问中位数值是多少?

思路:二分答案 V,则问题转化为了求子数组去重后元素个数小于等于 V 的个数。

如果把题意修改为子数组和小于等于 V,我们很容易使用双指针来做这道题。
如果我们有一个数据结构,可以快速维护去重后元素个数,即可使用双指针来做这道题。

这样的数据结构很容易想到,使用带计数的平衡树即可,常用的数据结构是 map
实现方法与子数组和完全一样。

复杂度:O(n log(n) log(n))

五、最后

这次比赛最后一题滑动窗口不容易想到,但是多想想也能想到,你学会了吗?

《完》

-EOF-

本文公众号:天空的代码世界
个人微信号:tiankonguse
公众号ID:tiankonguse-code

本文首发于公众号:天空的代码世界,微信号:tiankonguse
如果你想留言,可以在微信里面关注公众号进行留言。

关注公众号,接收最新消息

tiankonguse +
穿越