牛牛算数
30分做法
用冒泡排序等方法对数组排序后找出平均数与中位数,时间复杂度o(n^2),空间复杂度o(1)
100分做法
这里提供两种做法
1.时间复杂度o(nlogn)的做法
方法同上,只是在排序中选用o(nlogn)的排序算法即可,由于相关算法众多不一一在此列举了。由于中位数和平均数都可能有精度的问题,所以这里可以比较n中位数与n平均数的大小。仅展示使用sort的做法,时间复杂度o(nlogn),空间复杂度o(1);
class Solution {
public:
/**
*
* @param arr int整型vector
* @return int整型
*/
int Answerofjudge(vector<int>& arr) {
// write code here
sort(arr.begin(),arr.end());
long long sum1=0;
long long sum2=0;
long long n=arr.size();
if(n%2)
{
sum1=arr[n/2]*n;
}
else
{
sum1=(arr[n/2]+arr[n/2-1])*n/2;
}
for(int i=0;i<n;i++)sum2+=arr[i];
int ans;
if(sum1==sum2)ans=0;
else if(sum1>sum2)ans=1;
else ans=-1;
return ans;
}
};2.时间复杂度o(n)的做法
首先显然平均数是很容易o(n)的时间算出的,比较麻烦的就是中位数,因为中位数只和最中间的一个/两个数有关,所以可以用黑科技nth_element()在数据大时可以o(n)的时间复杂度找到中位数。空间复杂度o(1)。(虽然理论时间复杂度是低的,但是常数较大再加上sort的log的常数很小,实际测试时两者运行时间差别并不明显,特此说明)代码如下:
class Solution {
public:
/**
*
* @param arr int整型vector
* @return int整型
*/
int Answerofjudge(vector<int>& arr) {
// write code here
long long sum1=0;
long long sum2=0;
long long n=arr.size();
if(n%2)
{
nth_element(arr.begin(),arr.begin()+n/2+1,arr.end());
sum1=arr[n/2]*n;
}
else
{
nth_element(arr.begin(),arr.begin()+n/2,arr.end());
sum1=arr[n/2];
nth_element(arr.begin(),arr.begin()+n/2-1,arr.end());
sum1+=arr[n/2-1];
sum1*=n/2;
}
for(int i=0;i<n;i++)sum2+=arr[i];
int ans;
if(sum1==sum2)ans=0;
else if(sum1>sum2)ans=1;
else ans=-1;
return ans;
}
};