(1):
?思路:
1.首先要對數組nums排序,這樣兩數之間的差距最小。
2.題目要求我們通過最多?k
?次遞增操作,使數組中某個元素的頻數(出現次數)最大化。經過上面的排序,最大數組也就是在整個數組里的某一截。使用滑動窗口。
3.初始化兩個指針?left
?和?right
,分別表示滑動窗口的左右邊界,假設我們獲得了一截數組是我們想要的,怎么證明呢?判斷條件是什么?
4.?要最大可能頻數,先定義一個maxF來表示最高頻元素的最大可能頻數。可以通過Math.max來獲得最大頻數。
5.做一個假設,在窗口里的數字都變成最高元素(也就是right指針所在)。那么n個元素*最高元素=MaxSum,這個最大總和減去實際n個元素的總和的值(MaxSum-Sum=x),要是大于k就說明在這個滑動窗口里,數據太多,k達不到最高頻元素的最大可能頻數。左指針++。同時更新?sum
,直到?sum
?不大于?k
。更新?maxF
。
6.返回?maxF
代碼:
import java.util.Arrays;public class Solution {public int maxFrequency(int[] nums, int k) {Arrays.sort(nums);int left = 0;long sum = 0;int maxFreq = 0;for (int right = 0; right < nums.length; right++) {sum += nums[right];while ((long) nums[right] * (right - left + 1) - sum > k) {sum -= nums[left];left++;}maxFreq = Math.max(maxFreq, right - left + 1);}return maxFreq;}
}
代碼解釋:
- 排序數組:首先對數組進行排序,以便后續使用滑動窗口。
- 初始化變量:
left
:滑動窗口的左邊界sum
:窗口內所有元素的和(使用long
避免整數溢出)maxF
:記錄最大頻數
- 滑動窗口遍歷:
- 右指針
right
從 0 開始遍歷數組 - 每次將當前元素加入窗口,并更新窗口和
sum
- 檢查當前窗口是否滿足條件:
nums[right] * (right - left + 1) - sum <= k
- 如果不滿足,則縮小窗口左邊界
left
,并更新窗口和sum
- 如果不滿足,則縮小窗口左邊界
- 更新最大頻數
maxF
- 右指針
- 返回結果:遍歷結束后返回最大頻數。
復雜度分析:
- 時間復雜度:O (n log n)(排序) + O (n)(滑動窗口遍歷)= O (n log n)
- 空間復雜度:O (1)(僅使用常數額外空間
(2):?
?思路:
我們需要通過重新排列數組元素并減小它們的值,使得數組的第一個元素為 1,且相鄰元素的差的絕對值不超過 1,同時最大化數組中的最大值。關鍵在于構造一個從 1 開始的遞增序列,每個元素盡可能比前一個大 1,因為這樣可以得到最大的可能值
- 排序數組:首先將數組排序,以便后續處理。
- 貪心構造遞增序列:從 1 開始,依次嘗試構造下一個數(當前數 + 1),只要數組中存在至少一個元素大于等于當前需要構造的數,就可以使用該元素來構造,并繼續構造下一個更大的數。
代碼:
import java.util.Arrays;class Solution {public int maximumElementAfterDecrementingAndRearranging(int[] arr) {Arrays.sort(arr);int required = 1; // 需要構造的下一個數,初始為1(第一個元素必須是1)for (int x : arr) {if (x >= required) {required++; // 可以構造當前required,接下來構造required+1}}return required - 1; // 最大構造到required-1,因為最后一次遞增了required}
}
?代碼解釋
- 排序數組:使用
Arrays.sort(arr)
對數組進行升序排序,以便從小到大處理每個元素。 - 初始化變量:
required
表示當前需要構造的下一個數,初始為 1,因為數組的第一個元素必須是 1。 - 遍歷數組:對于每個元素
x
,如果x
大于等于當前需要構造的數required
,則說明可以使用該元素來構造required
,并將required
加 1,嘗試構造下一個更大的數(required + 1
)。 - 返回結果:最終
required - 1
即為能夠構造的最大數,因為每次成功構造一個數后required
會遞增,最后一次遞增后required
比最大數大 1。
這種方法通過貪心策略,每次盡可能構造更大的數,確保了構造的序列是連續遞增的,從而最大化了數組中的最大值。時間復雜度主要由排序決定,為 O (n log n),空間復雜度為 O (1)(不考慮排序的棧空間)。