leetcode 1846 減小和重新排列陣列後的最大元素
阿新 • • 發佈:2021-07-15
給你一個正整數陣列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 。
提示:
1 <= arr.length <= 105
1 <= arr[i] <= 109
排序+貪心
public static int maximumElementAfterDecrementingAndRearranging(int[] arr) {
if (arr == null || arr.length == 0) return -1;
if (arr.length == 1) return 0;
Arrays.sort(arr);
arr[0] = 1;
int n = arr.length;
for (int i = 1; i < n; i++) {
arr[i] = Math.min(arr[i], arr[i - 1] + 1);
}
return arr[n - 1];
}
測試用例
public static void main(String[] args) {
int[] arr = new int[]{2, 2, 1, 2, 1};
int ans = MaximumElementAfterDecrementingAndRearranging.maximumElementAfterDecrementingAndRearranging(arr);
System.out.println("MaximumElementAfterDecrementingAndRearranging demo01 result : " + ans);
arr = new int[]{100, 1, 1000};
ans = MaximumElementAfterDecrementingAndRearranging.maximumElementAfterDecrementingAndRearranging(arr);
System.out.println("MaximumElementAfterDecrementingAndRearranging demo02 result : " + ans);
arr = new int[]{1, 2, 3, 4, 5};
ans = MaximumElementAfterDecrementingAndRearranging.maximumElementAfterDecrementingAndRearranging(arr);
System.out.println("MaximumElementAfterDecrementingAndRearranging demo03 result : " + ans);
}