好吧,這個是剛從別人那里看到的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); } } }