Easy
题目描述
给你一个长度为 n 的整数数组 nums。
如果满足以下条件,则索引 i 处的元素被称为主导元素:
nums[i] > average(nums[i + 1], nums[i + 2], ..., nums[n - 1])
你的任务是统计主导索引的数量。
一组数字的平均值是将所有数字相加,然后除以数字的总数得到的值。
注意: 数组最右边的元素不是主导元素。
示例 1:
输入: nums = [5,4,3]
输出: 2
解释:
- 在索引 i = 0 处,值 5 是主导的,因为 5 > average(4, 3) = 3.5。
- 在索引 i = 1 处,值 4 主导子数组 [3]。
- 索引 i = 2 不是主导的,因为它右边没有元素。因此,答案是 2。
示例 2:
输入: nums = [4,1,2]
输出: 1
解释:
- 在索引 i = 0 处,值 4 主导子数组 [1, 2]。
- 在索引 i = 1 处,值 1 不是主导的。
- 索引 i = 2 不是主导的,因为它右边没有元素。因此,答案是 1。
提示:
1 <= nums.length <= 1001 <= nums[i] <= 100
解题思路
这道题要求我们找出数组中有多少个主导索引。对于每个索引 i,我们需要检查 nums[i] 是否大于其右侧所有元素的平均值。
解题思路
方法一:直接模拟(推荐) 由于数组长度最多为 100,我们可以采用暴力模拟的方法:
- 遍历数组中除最后一个元素外的每个位置
i - 对于每个位置
i,计算从i+1到数组末尾所有元素的平均值 - 比较
nums[i]与该平均值的大小关系 - 如果
nums[i]大于平均值,则该索引是主导索引
方法二:后缀和优化 为了避免重复计算,我们可以使用后缀和:
- 预计算从每个位置到数组末尾的元素和
- 对于每个位置
i,直接用预计算的和除以元素个数得到平均值
由于题目数据规模较小,两种方法的性能差异不大,但第一种方法更简洁易懂。
需要注意的边界条件:
- 数组最后一个元素不能是主导元素
- 当数组长度为 1 时,没有主导元素
- 比较时要注意浮点数精度问题
代码实现
class Solution {
public:
int dominantIndices(vector<int>& nums) {
int n = nums.size();
int count = 0;
for (int i = 0; i < n - 1; i++) {
int sum = 0;
for (int j = i + 1; j < n; j++) {
sum += nums[j];
}
double average = (double)sum / (n - i - 1);
if (nums[i] > average) {
count++;
}
}
return count;
}
};
class Solution:
def dominantIndices(self, nums: List[int]) -> int:
n = len(nums)
count = 0
for i in range(n - 1):
right_sum = sum(nums[i + 1:])
average = right_sum / (n - i - 1)
if nums[i] > average:
count += 1
return count
public class Solution {
public int DominantIndices(int[] nums) {
int n = nums.Length;
int count = 0;
for (int i = 0; i < n - 1; i++) {
int sum = 0;
for (int j = i + 1; j < n; j++) {
sum += nums[j];
}
double average = (double)sum / (n - i - 1);
if (nums[i] > average) {
count++;
}
}
return count;
}
}
var dominantIndices = function(nums) {
const n = nums.length;
let count = 0;
for (let i = 0; i < n - 1; i++) {
let sum = 0;
for (let j = i + 1; j < n; j++) {
sum += nums[j];
}
const average = sum / (n - i - 1);
if (nums[i] > average) {
count++;
}
}
return count;
};
复杂度分析
| 复杂度 | 分析 |
|---|---|
| 时间复杂度 | O(n²) |
| 空间复杂度 | O(1) |
说明:
- 时间复杂度:外层循环遍历 n-1 个元素,内层循环平均遍历 n/2 个元素,总体为 O(n²)
- 空间复杂度:只使用了常数个额外变量,为 O(1)