1. 程式人生 > 其它 >leetcode 1846 減小和重新排列陣列後的最大元素

leetcode 1846 減小和重新排列陣列後的最大元素

給你一個正整數陣列arr。請你對 arr執行一些操作(也可以不進行任何操作),使得陣列滿足以下條件:

  • arr第一個元素必須為1
  • 任意相鄰兩個元素的差的絕對值 小於等於1,也就是說,對於任意的 1 <= i < arr.length陣列下標從 0 開始),都滿足abs(arr[i] - arr[i - 1]) <= 1abs(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);
}