1. 题目来源
2. 题目解析
思路:
- 贪心题目猜结论…
- 结论 1: 一定存在一个最优解是一个单调数组。因为如果最优解是非单调数组的话,那么非单调的一段一定是上下波动不超过 1 的子段,那么就能将这段重排后使其变单调。
- 结论 2: 一定存在一个最优解,使得所有数的相对大小关系不变。即原数组中
a > b
,那么在最优解数组中也存在a` > b`
,即我们只需要让a
=a`
,b
=b`
即可。这样就能保证原数组与最优解数组中的各个元素的相对大小不发生变化。
- 由于最优解可以是一个单调数组,则我们可以针对原数组进行排序,最大的元素一定是末尾那个元素。再从首元素开始递推即可,每次将
f[i] = (f[i] == f[i - 1] ? f[i - 1] : f[i - 1] + 1)
变化即可。
看代码更容易理解。
- 时间复杂度: O ( n l o g n ) O(nlogn) O(nlogn)
- 空间复杂度: O ( 1 ) O(1) O(1)
代码:
class Solution {
public:
int maximumElementAfterDecrementingAndRearranging(vector<int>& arr) {
sort(arr.begin(), arr.end());
arr[0] = 1;
for (int i = 1; i < arr.size(); i ++ )
if (arr[i] == arr[i - 1]) continue;
else arr[i] = arr[i - 1] + 1;
return arr.back();
}
};