【LeetCode 6052 】最小平均差

14 篇文章 0 订阅

题目描述

给你一个下标从 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;
}
  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值