統計數組中各個元素出現的次數,元素取值范圍為:1到N


 問題描述:

 * 給定一個整數數組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");
        }
    }

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM