题目描述
给你一个下标从 0 开始长度为 n 的整数数组 nums 。
下标 i 处的 平均差 指的是 nums 中 前 i + 1 个元素平均值和 后 n - i - 1 个元素平均值的 绝对差 。两个平均值都需要 向下取整 到最近的整数。
请你返回产生 最小平均差 的下标。如果有多个下标最小平均差相等,请你返回 最小 的一个下标。
注意:
- 两个数的 绝对差 是两者差的绝对值。
- n 个元素的平均值是 n 个元素之 和 除以(整数除法) n 。
- 0 个元素的平均值视为 0 。
来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/minimum-average-difference
著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。
解题
1.暴力(会超时)
int pf(vector<int>& nums,int star,int end){
int sum=0;
int lens=end-star+1;
if(star>nums.size()-1)
return 0;
for(int i=star;i<=end;i++)
sum+=nums[i];
return sum/lens;
}
int minimumAverageDifference(vector<int>& nums) {
int left=0,right=0;
int len=nums.size();
int result=0;
int max_a=100001;
for(int i=0;i<nums.size();i++){
left=pf(nums,0,i);
right=pf(nums,i+1,len-1);
if(max_a>abs(left-right)){
max_a=abs(left-right);
result=i;
}
}
return result;
}
2.线段树( 时间复杂度O(1) )
时间和空间复杂度都超过100%。
int minimumAverageDifference(vector<int>& nums) {
vector<double> tmp;//存取前i个的均值;不能使用int,会因为整除而导致答案错误
int result=0,len=nums.size();
int left=0,right=0,max_a=100001;
double sum=0;//不能使用int,会因为整除而导致答案错误
for(int i=0;i<len;i++){
sum+=nums[i];
tmp.push_back(sum/(i+1));//存取前i个的均值
}
for(int i=0;i<len;i++){
left=int(tmp[i]);//前半段的均值
if(i!=len-1){//考虑i的情况
right=int((tmp[len-1]*len-tmp[i]*(i+1))/(len-i-1));//后半段的均值
}
else
right=0;
if(max_a>abs(left-right)){
max_a=abs(left-right);
result=i;
}
}
return result;
}