好吧,这个是刚从别人那里看到的https://www.cnblogs.com/kubidemanong/p/10409712.html,学到了,先记下来。

问题:给你n个无序的int整型数组arr,并且这些整数的取值范围都在0-20之间,要你在 O(n) 的时间复杂度中把这 n 个数按照从小到大的顺序打印出来。

对于数组来说,如果你是先把这 n 个数先排序,再打印,是不可能O(n)的时间打印出来的。但是数值范围在 0-20。我们就可以巧用数组下标了。把对应的数值作为数组下标,如果这个数出现过,则对应的数组加1

代码如下:

public void f(int arr[]) {
  int[] temp = new int[21];
  for (int i = 0; i < arr.length; i++) {
     temp[arr[i]]++;
  }
  //顺序打印
  for (int i = 0; i < 21; i++) {
     for (int j = 0; j < temp[i]; j++) {
       System.out.println(i);
     }
  }
}