給你一個正整數數組 arr 。請你對 arr 執行一些操作(也可以不進行任何操作),使得數組滿足以下條件:
- arr 中 第一個 元素必須為 1 。
- 任意相鄰兩個元素的差的絕對值 小于等于 1 ,也就是說,對于任意的 1 <= i < arr.length (數組下標從 0 開始),都滿足 abs(arr[i] - arr[i - 1]) <= 1 。abs(x) 為 x 的絕對值。
你可以執行以下 2 種操作任意次:
- 減小 arr 中任意元素的值,使其變為一個 更小的正整數 。
- 重新排列 arr 中的元素,你可以以任意順序重新排列。
請你返回執行以上操作后,在滿足前文所述的條件下,arr 中可能的 最大值 。
示例 1:輸入:arr = [2,2,1,2,1]
輸出:2
解釋:
我們可以重新排列 arr 得到 [1,2,2,2,1] ,該數組滿足所有條件。
arr 中最大元素為 2 。示例 2:輸入:arr = [100,1,1000]
輸出:3
解釋:
一個可行的方案如下:
1. 重新排列 arr 得到 [1,100,1000] 。
2. 將第二個元素減小為 2 。
3. 將第三個元素減小為 3 。
現在 arr = [1,2,3] ,滿足所有條件。
arr 中最大元素為 3 。示例 3:輸入:arr = [1,2,3,4,5]
輸出:5
解釋:數組已經滿足所有條件,最大元素為 5 。
解題思路
- 因為arr中第一個元素必須為 1,任意相鄰兩個元素的差的絕對值小于等于1,因為要獲取最大值,所以我們重新排列的數組只需要非遞減即可。
- 因為我們的目標數組是非遞減的數組,而我們可以重新排列 arr 中的元素,因此我們可以從小到大排列數組。因此最終構造出的目標數組為[1,1,1,2,3,4,5…max],max為最大值。(因為我們可以將廢棄無用的arr[i]直接減為1,任意的元素都可以變為1,所以1不參與目標數組的討論)
- 又因為arr的元素只能減少,因此我們arr[i]要想轉化為目標值,就必須arr[i]就必須大于目標值
這題就轉化為勇者斗惡龍的問題了,數組[1,2,3,4,5…max]為惡龍的能力值,我們要選出max個勇士,每個勇士的能力值都要大于惡龍的能力值
因此就可以貪心了,對arr進行排序,根據能力值從小到大選擇勇士,去對付能力值為[1,2,3,4,5…max]的惡龍
代碼
class Solution {public int maximumElementAfterDecrementingAndRearranging(int[] arr) {int n=arr.length,tar=1;Arrays.sort(arr);for (int i=0;i<n;i++){if(tar<=arr[i])tar++;}return tar-1;}
}