java - 如何获取给定数组中最大值出现的次数

标签 java algorithm

我正在研究一个逻辑,我需要找到给定范围内最大值出现的次数。

示例:

例如,如果输入数组为[5, 4, 5, 3, 2] 现在我将提供一个表示索引位置 [0, 1, 2, 3, 4] 的查询数组

这些索引位置指示我的输入数组的起始位置。

预期输出为 [2,1,1,1,1]

说明:

索引 0 到 n 表示输入数组为 [5, 4, 5, 3, 2]。这里最大元素是5并且出现了2次

索引 1 到 n 表示输入数组为 [4, 5, 3, 2]。这里最大元素是5并且出现1次

索引 2 到 n 表示输入数组为 [5, 3, 2]。这里最大元素是5并且出现1次

索引 3 到 n 表示输入数组为 [3, 2]。这里最大元素是3并且出现1次

索引 4 到 n 表示输入数组为 [2]。这里最大元素是2并且出现1次

现在这是我想出的代码:

public static List<Integer> process(List<Integer> input, List<Integer> indexList) {
    // Write your code here
    List<Integer> list = new ArrayList<>();
    for (int i = 0; i < indexList.size(); i++) {
        int index = indexList.get(i);
        int max = Integer.MIN_VALUE;
        int count = 0;
        for (int j = index; j < input.size(); j++) {
            int data = input.get(j);
            if (data > max) {
                max = data;
                count = 1;
            } else if (data == max) {
                count++;
            }
        }
        list.add(count);
    }
    return list;
}

有没有更好的方法以更少的时间复杂度来做到这一点?

最佳答案

一个简单的 O(n) 算法就可以完成这项工作。只需在从数组末尾遍历时更新 max 值及其 count 即可。

Java代码:

public static List<Integer> process(List<Integer> data, List<Integer> indexList) {
    int n = data.size();
    int[]result = new int[n];
    int max = data.get(n - 1);
    int count = 1;
    result[n - 1] = 1;
    for(int i = n - 2; i >= 0; i--){
         if(max == data.get(i)){
            count++;
         }else if(max < data.get(i)){
            max = data.get(i);
            count = 1;
         }
         result[i] = count;
    }
    // Populate result
    List<Integer> list = new ArrayList<>();
    for(int i : indexList){
        list.add(result[i]);
    }
    return list;
}

关于java - 如何获取给定数组中最大值出现的次数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59762101/

相关文章:

java - 如果它们具有相同的名称,我如何调用 java 方法而不是新成员函数

java - 迭代二维列表并将元素放入哈希表中

java - 生命游戏作业

c++ - 在 C++ 中使用 BFS 获取 2 个顶点之间的路径

java - 这是什么Jini技术?

java - 如何在 recyclerview 中添加聊天日期?

algorithm - 从边缘找到内部几何

java - Java中的十进制转二进制函数

arrays - 使用曼伯迈尔斯算法的后缀数组

algorithm - 使用 2 组坐标对真阳性、假阳性和假阴性进行分类