我想找到在ArrayList
中保持最大值的索引/索引。我想保留数字所在的顺序(换句话说没有排序)因为我想跟踪哪个索引具有什么值。这些值来自随机数生成器,并且可能有两个(或更多)索引共享相同的最大值。
示例ArrayList
:
12,78,45,78
0,1,2,3< - indices
(所以索引,1和3包含具有最大值的值。我想保持索引1和3的值为78的事实。我不想只创建一个新的ArrayList
和让新ArrayList
的索引0和1具有值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;
}
答案 0 :(得分: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;
}
答案 1 :(得分: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;
}