0
点赞
收藏
分享

微信扫一扫

【LeetCode 6052 】最小平均差

陆佃 2022-05-01 阅读 33

题目描述

给你一个下标从 0 开始长度为 n 的整数数组 nums 。

下标 i 处的 平均差 指的是 nums 中 前 i + 1 个元素平均值和 后 n - i - 1 个元素平均值的 绝对差 。两个平均值都需要 向下取整 到最近的整数。

请你返回产生 最小平均差 的下标。如果有多个下标最小平均差相等,请你返回 最小 的一个下标。

注意:

  • 两个数的 绝对差 是两者差的绝对值。
  • n 个元素的平均值是 n 个元素之 和 除以(整数除法) n 。
  • 0 个元素的平均值视为 0 。

解题

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;
}
举报

相关推荐

0 条评论