2

我想找到在ArrayList. 我想保留数字所在的顺序(换句话说,没有排序),因为我想跟踪哪个索引具有什么值。这些值来自随机数生成器,并且可能有两个(或更多)索引共享相同的最大值。

一个例子ArrayList

12、78、45、78

0,1,2,3 <- 索引

(所以索引 1 和 3 包含具有最大值的值。我想保持索引 1 和 3 的值是 78 的事实。我不想只创建一个新的ArrayList并拥有新的索引 0 和 1ArrayList有值 78)

因此,我想找到所有具有最大值的索引,因为如果有多个索引,我将对它们做一些事情来“打破”平局。那么如何找到包含最大值的索引并保持索引到值的关系呢?

我写了以下方法:

public static ArrayList<Integer> maxIndices(ArrayList<Integer> numArrayList) {
// ???  
    return numArrayList;
}

public static void removeElement(ArrayList<Integer> numArrayList, int index) {
    numArrayList.remove(index);
}

public static int getMaxValue(ArrayList<Integer> numArrayList) {
    int maxValue = Collections.max(numArrayList);
    return maxValue;
}

public static int getIndexOfMaxValue(ArrayList<Integer> numArrayList, int maxVal) {
    int index = numArrayList.indexOf(maxVal);
    return index;
}
4

2 回答 2

3
public static ArrayList<Integer> maxIndices(ArrayList<Integer> list) {
    List<Integer> indices = new ArrayList<Integer>();
    int max =  getMaxValue(list);
    for (int i = 0; i < list.size(); i++) {
       if(list.get(i) == max) {
           indices.add(list.get(i));
        }
     }

     return indices;
}
于 2012-12-07T03:09:44.427 回答
1

O(n) 解决方案:

   public static List<Integer> maxIndices(List<Integer> l) {
        List<Integer> result = new ArrayList<Integer>();
        Integer candidate = l.get(0);
        result.add(0);

        for (int i = 1; i < l.size(); i++) {
            if (l.get(i).compareTo(candidate) > 0) {
                candidate = l.get(i);
                result.clear();
                result.add(i);
            } else if (l.get(i).compareTo(candidate) == 0) {
                result.add(i);
            }
        }
        return result;
    }
于 2012-12-07T05:11:55.090 回答