【发布时间】:2015-11-02 07:23:02
【问题描述】:
我想从0开始找出数组中每个元素的排名。
例如:
arr = {2, 1,3 }
rank will be {1,0 ,2}
说明:
rank of 2 is 1 because 2 is greater than exactly 1 element
rank of 1 is 0 because 1 is greater than exactly 0 element
rank of 3 is 2 because 1 is greater than exactly 2 element
我尝试的是n^2时间复杂度算法。我想要一个线性时间复杂度的算法O(n)。
有人在下面的评论部分给了我解决方案,但他的评论已被删除,我不知道如何。这适用于负整数和正整数以及非常大的列表。
感谢作者
import java.io.IOException;
import java.io.InputStream;
import java.util.*;
class rank{
public static void main(String args[]){
ArrayList<Integer> list = new ArrayList<Integer>();
list.add(2);
list.add(1);
list.add(3);
ArrayList<Integer> listCopy = new ArrayList<Integer>(list);
Collections.sort(list); // sorting array
// System.out.println("List : " + listCopy);
// System.out.println("Sorted List : " + list);
Map<Integer, Integer> rankMap = new HashMap<Integer, Integer>();
int counter = 0;
for(int x : list) {
rankMap.put(x, counter);
// list value as key and rank as value.
counter++;
}
StringBuffer sb=new StringBuffer();
for(int x : listCopy) {
sb.append(rankMap.get(x) + " ");
// System.out.println(map.get(x));
}
System.out.println( sb.toString().substring(0, sb.length()-1))
}
}
【问题讨论】:
-
对数组进行排序呢?每个元素的索引将是它的排名。但是它可能不会在线性时间内。
-
对数组的副本进行排序 - 删除重复项 - 将第一个数组中的 int 与具有唯一元素的排序数组中的 int 的索引进行比较
-
计数排序会起作用吗??
-
@RealSkeptic 您是对的,只是在特殊情况下(数据类型允许)可以按线性时间排序。以基数排序为例。
-
@HyperZ 基数排序的线性是有问题的(单词的宽度以 log n 为界)。
标签: java arrays algorithm time-complexity