leetcode 1051. 高度檢查器

【題目】1051. 高度檢查器

學校在拍年度紀念照時,一般要求學生按照 非遞減 的高度順序排列。
請你返回能讓所有學生以 非遞減 高度排列的最小必要移動人數。
注意,當一組學生被選中時,他們之間可以以任何可能的方式重新排序,而未被選中的學生應該保持不動。

示例:

輸入:heights = [1,1,4,2,1,3]
輸出:3 
解釋:
當前數組:[1,1,4,2,1,3]
目標數組:[1,1,1,2,3,4]
在下標 2 處(從 0 開始計數)出現 4 vs 1 ,所以我們必須移動這名學生。
在下標 4 處(從 0 開始計數)出現 1 vs 3 ,所以我們必須移動這名學生。
在下標 5 處(從 0 開始計數)出現 3 vs 4 ,所以我們必須移動這名學生。

示例 2:

輸入:heights = [5,1,2,3,4]
輸出:5

示例 3:

輸入:heights = [1,2,3,4,5]
輸出:0

提示:
1 <= heights.length <= 100
1 <= heights[i] <= 100

【解題思路1】對比排序後和排序前不同的元素個數

1 對錶示學生身高的數組排序,得到一個排序後的新數組。
2 對比排序後數組和原數組,記錄下標值相同但元素值不同的下標個數,即爲排錯位置的學生個數。

class Solution {
    public int heightChecker(int[] heights) {
        int[] copy = heights.clone();
        Arrays.sort(copy);

        int count = 0;
        for (int i = 0; i < heights.length; i++) {
            if(copy[i] != heights[i]){
                count++;
            }
        }
        return count;
    }
}

【解題思路2】桶排序 計次排序

首先我們其實並不關心排序後得到的結果,我們想知道的只是在該位置上,與最小的值是否一致
題目中已經明確了值的範圍 1 <= heights[i] <= 100
這是一個在固定範圍內的輸入,比如輸入: [1,1,4,2,1,3]
輸入中有 3 個 1,1 個 2,1 個 3 和 1 個 4,3 個 1 肯定會在前面,依次類推
所以,需要的僅僅只是計數而已

class Solution {
    public int heightChecker(int[] heights) {
        // 值的範圍是1 <= heights[i] <= 100,因此需要1,2,...,100,共101個桶
        int[] arr = new int[101];
        // 遍歷數組heights,計算每個桶中有多少個元素
        // 將這101個桶中的元素,一個一個桶地取出來,元素就是有序的
        for (int height : heights) {
            arr[height]++;
        }

        int count = 0;
        for (int i = 1, j = 0; i < arr.length; i++) {
            // 從桶中取出元素時,元素的排列順序就是非遞減的,然後與heights中的元素比較,如果不同,計算器就加1
            while (arr[i]-- > 0) {
                if (heights[j++] != i) count++;
            }
        }
        return count;
    }
}
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章