【问题标题】:number of subarray with average greater than average of the rest of the elements of array平均数大于数组其余元素平均数的子数组数
【发布时间】:2019-08-28 10:39:07
【问题描述】:

我们得到一个大小为

and A[i]

我正在检查每个子数组并将其平均值与其他元素进行比较。

【问题讨论】:

  • 离开标题答案是零。没有办法让子数组的平均值高于同一数组中的每个值
  • “子数组”一定是连续的吗?
  • O(n log n) 足够了吗?不确定你能不能做得更好。
  • 尝试用前缀和数组来表达您的条件:S[i] = A[1] + A[2] + ... + A[i]

标签: arrays algorithm sorting sum sub-array


【解决方案1】:
public class FindingSubArray {

public static void main(String[] args) {
    Scanner in = new Scanner(System.in);

    int n = in.nextInt();
    int[] arr = new int[n];

    for (int i = 0; i < n; i++) {
        arr[i] = in.nextInt();
    }

    ArrayList<Integer> a = new ArrayList<>();
    ArrayList<Integer> b = new ArrayList<>();

    for (int i = 0; i < n; i++) {
        for (int j = i; j < n; j++) {
            double avg1 = getAverage(i,j,arr);
            double avg2 = getAverageOfRest(i,j,arr);
            //System.out.println(avg1+" "+avg2);
            if(avg1 > avg2) {
                a.add(i+1);
                b.add(j+1);
            }
        }
    }

    System.out.println(a.size());
    for(int i=0;i<a.size();i++){
        System.out.println(a.get(i)+" "+b.get(i));
    }
}

private static double getAverageOfRest(int i, int j, int[] arr) {
    double result = 0;
    int count = 0;

    for(int k=0;k<i;k++) {
        result += arr[k] ;
        count ++;
    }
    for(int k=j+1;k<arr.length;k++) {
        result += arr[k] ;
        count ++;
    }
    if(count > 0)
        return result/count;
    else
        return 0;   
}

private static double getAverage(int i, int j, int[] arr) {
    double result = 0;
    int count = 0;
    for (int k = i; k <= j; k++) {
         result += arr[k] ;
        count ++;
    }

    if(count > 0)
        return result/count;
    else
        return 0;
}

}

【讨论】:

    猜你喜欢
    • 2014-04-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-01-11
    • 2013-12-29
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多