NO.1838最高頻元素的頻數

元素的頻數是該元素在一個數組中出現的次數。算法

給你一個整數數組 nums 和一個整數 k 。在一步操做中,你能夠選擇 nums 的一個下標,並將該下標對應元素的值增長 1 。數組

執行最多 k 次操做後,返回數組中最高頻元素的 最大可能頻數markdown

示例 1:優化

輸出:3
解釋:對第一個元素執行 3 次遞增操做,對第二個元素執 2 次遞增操做,此時 nums = [4,4,4] 。
4 是數組中最高頻元素,頻數是 3 。
複製代碼

示例 2:this

輸出:2
解釋:存在多種最優解決方案:
- 對第一個元素執行 3 次遞增操做,此時 nums = [4,4,8,13] 。4 是數組中最高頻元素,頻數是 2 。
- 對第二個元素執行 4 次遞增操做,此時 nums = [1,8,8,13] 。8 是數組中最高頻元素,頻數是 2 。
- 對第三個元素執行 5 次遞增操做,此時 nums = [1,4,13,13] 。13 是數組中最高頻元素,頻數是 2 。
複製代碼

示例 3:spa

輸入: nums = [3,9,6], k = 2
輸出: 1
複製代碼

提示:code

  • 1 <= nums.length <= 10^5
  • 1 <= nums[i] <= 10^5
  • 1 <= k <= 10^5

思考過程: 遍歷全部狀況再優化能夠解決全部的算法問題。orm

第一步:將 nums 數組從小到大排序。
第二步:用變量 i 從前日後依次遍歷,把每一次取到的 nums[i] 值當作完成遞增操做後的最高頻元素。
第三步:用變量 j 從 變量 i 開始從後往前依次遍歷,檢查 num[j] 是否能經過遞增操做變成最高頻元素。排序

時間複雜度:O(n^2)
空間複雜度:O(1)get

優化思路: 因爲這題的數據量較小,在採用HashMap進行 nums 數組的頻數統計,從而達到去重的效果後便可完成提交。

時間複雜度:O(n^2)
空間複雜度:O(1)
Ps:過久沒刷題,剛開始復健,本身總結一下發現我這優化了個寂寞。

代碼:

class Solution { 
    public int maxFrequency(int[] nums, int k) { 
        //HashMap計數 
        HashMap<Integer, Integer> map = new HashMap<>(); 
        for (int i = 0; i < nums.length; i++) { 
        map.put(nums[i], map.getOrDefault(nums[i], 0) + 1); 
        } 
        
        //按數字大小排序 
        int index = 0; 
        int[][] fre = new int[map.size()][2]; 
        for (Map.Entry<Integer, Integer> entry : map.entrySet()) { 
            fre[index][0] = entry.getKey(); 
            fre[index][1] = entry.getValue(); 
            index++; 
        } 
        Arrays.sort(fre,(a, b) -> (a[0] - b[0])); 

        //掃描 
        int maxFre = 0;
        for (int i = 0; i < fre.length; i++) { 
            int this_i_max = 0; 
            int this_i_k = k; 
                for (int j = i; j >= 0; j--) { 
                    int delta = fre[i][0] - fre[j][0]; 
                    if (delta == 0) { 
                        this_i_max += fre[j][1]; 
                    } else if ((this_i_k - delta * fre[j][1]) >= 0) { 
                        this_i_k -= delta * fre[j][1]; 
                        this_i_max += fre[j][1]; 
                    } else { 
                        this_i_max += this_i_k / delta; break; 
                    } 
                } 
                maxFre = Math.max(maxFre, this_i_max); 
        } 
        return maxFre; 
    } 
}
複製代碼
相關文章
相關標籤/搜索