题目
https://leetcode-cn.com/problems/maximum-element-after-decreasing-and-rearranging/
方法一、排序+贪心
思路
- 如果一个数组是满足要求的,那么将它的元素按照升序排序后得到的数组也是满足要求的。
- 那么数组中相邻两个元素,要么后者等于前者,要么后者等于前者加上 1。
-
代码
public static int maximumElementAfterDecrementingAndRearranging(int[] arr) {// 从小到大排序 arrArrays.sort(arr);// 初始化data 0位置为1,直接把arr第0位舍弃掉,因为不管他是不是1我们都要给他改成1arr[0] = 1;// 循环arr,判断下标位置i与下标i-1的差值,如果大于1就改为data[i-1]+1,否则就赋值为arr[i]for (int i = 1; i < arr.length; i++) {if (arr[i] - arr[i - 1] > 1) {arr[i] = arr[i - 1] + 1;}}return arr[arr.length-1];}
复杂度分析
时间复杂度:O(nlogn),其中 nn 是数组 \textit{arr}arr 的长度。时间复杂度即排序的复杂度。
空间复杂度:O(logn)。空间复杂度不考虑输入,因此空间复杂度主要取决于排序时产生的 O(\log n)O(logn) 的栈空间。方法二、计数排序 + 贪心
官方解析里的,没看懂。
