1846.减小和重新排列数组后的最大元素

基本思想:

1.将数组排好序
2.处理特殊情况,只有一个元素并且值不为1,返回1
3.一般情况:
    1. 数组内有1,并且不在0号位置,将1的位置和0号位置的值交换
    2. 数组内没有1,将0号位置赋值为1

经过上面的操作,我们得到了一个0号元素为1且递增的数组,接下来从0号位置到n-1的位置依次扫描,
如果后面的位置减去前面的位置的值大于1,那么后面的位置就要减小为(前面的值+1)。
扫描结束后返回数组最大值

代码

#!/usr/bin/env python
# -*- coding: utf-8 -*-
# @Time : 2021/7/15 9:58
# @Author : wutiande

class Solution:
    def maximumElementAfterDecrementingAndRearranging(self, arr:list) -> int:
        length = len(arr)
        arr.sort()
        if arr[0] !=1 and length==1:
            return 1
        elif arr[0] !=1:
            for i in range(1,length):
                if arr[i] == 1: # swap
                    arr[0],arr[i] = arr[i],arr[0]
                    break
            if arr[0] != 1:
                arr[0] = 1

        for i in range(0,length-1):
            if arr[i+1] - arr[i] > 1:
                arr[i+1] = arr[i]+1
            print(arr)
        return max(arr)

if __name__ == '__main__':
    s = Solution()
    arr = [10,1,1000]
    ans = s.maximumElementAfterDecrementingAndRearranging(arr)
    print(ans)

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值