题题题 | 豆包MarsCode AI 刷题

36 阅读3分钟

题目描述:

小R从班级中抽取了一些同学,每位同学都会给出一个数字。已知在这些数字中,某个数字的出现次数超过了数字总数的一半。现在需要你帮助小R找到这个数字。

测试样例:

样例1:

输入:array = [1, 3, 8, 2, 3, 1, 3, 3, 3]
输出:3

样例2:

输入:array = [5, 5, 5, 1, 2, 5, 5]
输出:5

样例3:

输入:array = [9, 9, 9, 9, 8, 9, 8, 8]
输出:9
我的思路把这个大致分为两个阶段:
阶段1:找出候选数字
初始化一个候选数字 candidate 和一个计数器 count。
遍历数组,对于每个数字:如果计数器为0,则将当前数字设为候选数字,并将计数器设为1。如果计数器不为0,且当前数字与候选数字相同,则计数器加1;否则计数器减1。遍历结束后candidate 中存储的就是可能的候选数字。
阶段2:验证候选数字
再次遍历数组,计算候选数字的出现次数,判断是否超过数组长度的一半。

问题描述
小R正在研究一组观光景点,每个景点都有一个评分,保存在数组 values 中,其中 values[i] 表示第 i 个观光景点的评分。同时,景点之间的距离由它们的下标差 j - i 表示。
一对景点 (i < j) 的观光组合得分为 values[i] + values[j] + i - j,也就是两者评分之和减去它们之间的距离。小R想知道,在哪种情况下能够获得观光景点组合的最高得分。
测试样例
样例1:
输入:values = [8, 3, 5, 5, 6]
输出:11
样例2:
输入:values = [10, 4, 8, 7]
输出:16
样例3:
输入:values = [1, 2, 3, 4, 5]
输出:8
首先,我们可以重写观光组合的得分公式,以便更清晰地看到如何优化计算:
score(i,j)=values[i]+values[j]+i−j=(values[i]+i)+(values[j]−j)
从这个公式中,我们可以发现,如果我们将每个景点的评分与其下标相加(values[i] + i),并将每个景点的评分与其下标相减(values[j] - j),那么观光组合的得分就是这两个值的和。
因此,我们可以使用双指针或单调栈的方法来优化计算。不过,考虑到我们需要找到一对景点 (i, j) 使得 i < j 并且得分最大,我们可以使用一种更简单且有效的方法:
创建一个新的数组 modified_values,其中 modified_values[k] = values[k] + k。
初始化两个变量 max_score 和 max_j,分别用于存储最高得分和对应的 j 值。
遍历 modified_values 数组,对于每个位置 j,计算 score = modified_values[j] - (某个之前的 modified_values[i] - i 的最大值)。为了高效地找到 modified_values[i] - i 的最大值,我们可以使用一个变量 max_prefix 来维护到当前位置为止 modified_values[i] - i 的最大值。更新 max_score 和 max_j(如果需要)。在遍历结束后,max_score 就是观光景点组合的最高得分。

收起