1846.减小和重新排列数组后的最大元素
题目描述:
给你一个正整数数组arr。请你对arr执行一些操作(也可以不进行任何操作),使得数组满足一下条件
示:
1:arr中第一个元素必须为1。
2:任意相邻两个元素的差的绝对值小于等于1,也就是说,对于任意的1<=i<arr.length(数组下标从0开始),都满足abs(arr[i]-arr[i-1]) <= 1。abs(x)为x的绝对值。
你可以执行一下两种操作任意次:
1、减小arr中任意元素的值,使其变为一个更小的正整数。
2、重新排列arr中的元素,可以以任意顺序重新排列。
请你返回执行以上操作后,在满足前文所述条件下,arr中可能的最大值。
输入:arr = [2, 2, 1, 2, 1]
输出:2
解释:我们可以重新排列arr得到[1, 2, 2, 2, 1],该数组满足所有条件。arr中最大元素为2。
示例2:
输入:arr = [100, 1, 1000]
输出:3
解释:重新排列arr得到[1, 100, 1000],将第二个元素调整为2,将第三个元素调整为3。当前arr = [1, 2, 3],满足上述所有条件。arr中元素最大值为3。
示例3:
输入:arr = [1, 2, 3, 4, 5]
输出:5
解释:数组本身已经满足所有条件,最大元素为5。
思路:
按照题意,先排序,判断arr第一位是不是1,不是的话,根据题意设置为1;接下来遍历arr,判断当前元素与前一个元素的绝对差值是否大于1,如果是,则将当前元素设置为前一个元素的值+1.遍历后,返回arr的最后一个元素。
代码:
class Solution:
def maximumElementAfterDecrementingAndRearranging(self, arr: List[int]) -> int:
arr.sort()
if arr[0] != 1:
arr[0] = 1
for i in range(1, len(arr)):
if abs(arr[i] - arr[i-1]) > 1:
arr[i] = arr[i-1] + 1
return arr[-1]