题意整理
- 给定一个数组,计算中位数和平均数。
- 如果中位数大于平均数,输出1;如果小于,输出-1;如果等于,输出0。
方法一(排序+模拟)
1.解题思路
- 首先计算中位数和平均数。
- 计算中位数时,先对数组排序,如果数组长度是奇数,直接返回最中间的元素;如果是偶数,则返回中间两个数的平均数。计算平均数时,先统计累加和,然后再除以数组中元素个数,即可得到平均数。
- 判断中位数和平均数的大小,输出对应的值。
动图展示:
2.代码实现
import java.util.*; public class Solution { /** * * @param arr int整型一维数组 * @return int整型 */ public int Answerofjudge (int[] arr) { //中位数 double median=getMedian(arr); //平均数 double avg=getAvg(arr); //中位数大于平均数,返回1 if(median>avg){ return 1; } //中位数小于平均数,返回-1 else if(median<avg){ return -1; } //中位数等于平均数,返回0 else{ return 0; } } //计算中位数 private double getMedian(int[] arr){ //排序 Arrays.sort(arr); int n=arr.length; if(n%2==1){ return arr[n/2]; } else{ return (arr[n/2-1]+arr[n/2])/2.0; } } //计算平均数 private double getAvg(int[] arr){ int n=arr.length; //累加和 double sum=0.0; for(int i=0;i<n;i++){ sum+=arr[i]; } return sum/n; } }
3.复杂度分析
- 时间复杂度:排序的时间复杂度为,其它循环是线性的,所以时间复杂度为。
- 空间复杂度:需要额外常数级别的空间,所以空间复杂度为。
方法二(按平均数分组)
1.解题思路
- 首先计算数组的平均数。
- 然后按平均数分为小于平均数的部分和大于等于平均数的部分。记录arr数组中小于平均数部分的最大值,大于平均数部分的最小值。
- 如果小于平均数的元素的数量大于,则中位数一定在小于平均数的部分取,中位数必定小于平均数,返回-1;如果小于平均数的元素的数量小于,则中位数一定在大于平均数的部分取,中位数必定大于平均数,返回1;如果小于平均数的元素的数量等于,则中位数要么取大于平均数的最小值,要么取大于平均数的最小值和小于平均数的最大值两者的平均数,然后根据情况,返回对应的值。
2.代码实现
import java.util.*; public class Solution { /** * * @param arr int整型一维数组 * @return int整型 */ public int Answerofjudge (int[] arr) { //平均数 double avg=getAvg(arr); //num1记录arr数组中小于平均数的最大值,num2记录arr数组中大于平均数的最小值 int num1=0,num2=Integer.MAX_VALUE; //cnt记录arr数组中小于平均数的个数 int cnt=0,n=arr.length; for(int a:arr){ if(a<avg){ cnt++; num1=Math.max(num1,a); } else{ num2=Math.min(num2,a); } } //如果小于平均数的个数有n/2个 if(cnt==n/2){ //如果n是奇数,则中位数恰好为num2 if(n%2==1){ if(avg<(double)num2) return 1; else if(avg>(double)num2) return -1; else return 0; } //如果n是偶数,则中位数为num1与num2的平均数 else{ if(avg<(num1+num2)/2.0) return 1; else if(avg>(num1+num2)/2.0) return -1; else return 0; } } return cnt>n/2?-1:1; } //计算平均数 private double getAvg(int[] arr){ int n=arr.length; //记录累加和 double sum=0.0; for(int i=0;i<n;i++){ sum+=arr[i]; } return sum/n; } }
3.复杂度分析
- 时间复杂度:所有循环都是线性的,所以时间复杂度为。
- 空间复杂度:需要额外常数级别的空间,所以空间复杂度为。