問題描述:
* 給定一個整數數組a,長度為N,元素取值范圍為[1,N]。
* 統計各個元素出現的次數,要求時間復雜度為O(N),空間復雜度為O(1)。
* 可以改變原來數組結構。
思路:
* 從第一個元素開始遍歷,每遍歷到一個元素,將(該元素值 - 1 記為index)作為一個下標值,令該下標對應的元素值為元素 index+1出現的次數。
* 若下標index為負值,說明該元素已經處理過,跳過;
* 判斷,若a[index]為正,則賦初值-1;若為負,則執行減1操作。
* 最后,數組中存儲的元素即為統計次數,而該元素對應的下標+1即為元素值。
代碼:
public static void main(String[] args) { // TODO Auto-generated method stub int n = 6; int[] a = new int[]{6,2,4,1,2,5}; int i = 0; //采用while循環 while(i < n){ //由於元素取值范圍為[1,N],因此,可以將(當前元素值-1)作為下標值,找到相應位置處的元素,將其存儲的值作為-times,因為原來存儲值都為正值,為防止混淆,用負值存儲 int temp = a[i] - 1; if(temp < 0){ //表示該元素已經處理過了,跳過 i++; continue; } else if(a[temp] > 0){//第一次處理一個值 a[i] = a[temp];//暫存新元素 a[temp] = -1; } else {//已經不是第一次處理該值了 a[i] = 0; //沒有新的元素要處理,置0 a[temp]--; } } for(int j = 0; j < n; ++j){ System.out.print(j+1 + " , " + -a[j] + "\t"); } }