抖音 UG 社招一面算法原题

2024-05-31 20:28:53 浏览数 (2)

史上最严热点新机制

或许是受到前段时间「巴黎丢作业」的影响,抖音近日(5月27日)实施了新的热点内容核实机制。

具体来说,若用户在抖音以热点事件当事人身份发声,抖音将联系当事人进行身份认证。

逾期未认证的用户,抖音将采取包括强提醒标注、禁言等一系列措施,直至用户提供可信材料。

同时,对于演绎类内容,抖音要求发布者必须显著标注"虚构演绎"声明,对于部分疑似摆拍的热点内容,抖音称将主动请求各地相关部门核实或联动各地新闻机构调查。

如此一来,基本上是把"造谣骗流量"的车门焊死了,但这也将大大增加抖音方面的运营成本。

个人感觉:初心很好,但如果严格按照上述说的来做,其实很难达到好的效果。

从以前的「纯算法」到现在的「人工介入」,以及认证材料的合理性,再到标记的及时性,都可能会让内容平台呈现的效果大打折扣。

要知道,一个视频如果因为新规则晚了半天进入流量池,可能就已经错过了最佳传播时间了。

而且任何打击类的新规则,也都无法避免的误伤问题。

对于抖音提出的「史上最严热点新机制」,你怎么看?

...

回归主题。

来一道和「字节跳动(抖音 UG)」相关的题目。

题目描述

平台:LeetCode

题号:907

给定一个整数数组 arr,找到 min(b) 的总和,其中 b 的范围为 arr 的每个(连续)子数组。

由于答案可能很大,因此 返回答案模

10^9 7

示例 1:

代码语言:javascript复制
输入:arr = [3,1,2,4]

输出:17

解释:
子数组为 [3],[1],[2],[4],[3,1],[1,2],[2,4],[3,1,2],[1,2,4],[3,1,2,4]。 
最小值为 3,1,2,4,1,1,2,1,1,1,和为 17。

示例 2:

代码语言:javascript复制
输入:arr = [11,81,94,43,3]

输出:444

提示:

1 <= arr.length <= 3 times 10^4
1 <= arr[i] <= 3 times 10^4

单调栈 数学

原问题为求所有子数组的最小值之和。

统计所有子数组需要枚举左右端点,复杂度为

O(n^2)

,对于每个子数组,我们还需要通过线性扫描的方式找到其最小值,复杂度为

O(n)

,因此朴素解法的整体复杂度为

O(n^3)

,题目给定数据范围为

3 times 10^4

,会 TLE

由于我们是从子数组中取最小值来进行累加,即参与答案构成的每个数必然某个具体的

arr[i]

「因此我们可以将原问题转化为「考虑统计每个

arr[i]

对答案的贡献」。」

对于某一个

arr[i]

而言,我们考虑其能够作为哪些子数组的最小值。

我们可以想象以

arr[i]

为中心,分别往两端进行拓展,只要新拓展的边界不会改变「

arr[i]

为当前子数组的最小值」的性质即可。

换句话说,我们需要找到

arr[i]

作为最小值的最远左右边界,即找到

arr[i]

左右最近一个比其小的位置 lr

「在给定序列中,找到任意

A[i]

最近一个比其大/小的位置,可使用「单调栈」进行求解。」

到这里,我们会自然想到,通过单调栈的方式,分别预处理除 lr 数组:

  • l[i] = loc 含义为下标 i 左边最近一个比 arr[i] 小的位置是 loc(若在
arr[i]

左侧不存在比其小的数,则 loc = -1

  • r[i] = loc 含义为下标 i 右边最近一个比 arr[i] 小的位置是 loc(若在
arr[i]

左侧不存在比其小的数,则 loc = n

当我们预处理两数组后,通过简单「乘法原理」即可统计以

arr[i]

为最小值时,子数组的个数:

  • 包含
arr[i]

的子数组左端点个数为

a = i - l[i]

  • 包含
arr[i]

的子数组右端点个数为

b = r[i] - i

子数组的个数 X 子数组最小值

arr[i]

,即是当前

arr[i]

对答案的贡献:

a times b times arr[i]

「统计所有

arr[i]

对答案的贡献即是最终答案,但我们忽略了「当 arr 存在重复元素,且该元素作为子数组最小值时,最远左右端点的边界越过重复元素时,导致重复统计子数组」的问题。」

我们不失一般性的举个

0 人点赞