zoukankan      html  css  js  c++  java
  • 每日leetcode-数组-453. 最小操作次数使数组元素相等

    分类:数组-数组的改变、移动

    题目描述:给定一个长度为 n 的 非空 整数数组,每次操作将会使 n - 1 个元素增加 1。找出让数组所有元素相等的最小操作次数。

    用例:

    输入:
    [1,2,3]
    输出:
    3
    解释:
    只需要3次操作(注意每次操作会增加两个元素的值):
    [1,2,3] => [2,3,3] => [3,4,3] => [4,4,4]

    解题思路:

    1. 假设我们最少的操作次数是k,k次操作后每个元素相等,相等元素设为target
    2. 对于整个列表的n - 1个元素都要进行加一操作那么增加的总数是 k * (n - 1)
    3. 原本的列表之和为 sum(nums),k次操作后应该存在这样的关系等式:


    k[最少操作次数] * (n - 1)[每次对n - 1个元素进行操作] + sum(nums)[原列表的和] = target[操作后的相等元素] * n
    即:

     k *(n-1)+sum(nums)= target * n

    这里最关键的地方是确定target的值,如果我们知道了target的值那么肯定就能知道k,那么target的值是多少呢?

    答案是:k + nums中的最小值 即:min(nums) + k


    猜想为何:因为对于最小值,你每次的递加都必须对原列表的最小值加一,每次操作中必须覆盖最小值, k次操作后, 最小值就变为了min(nums) + k,该值就是最后的相同值
    即公式:

     k *(n-1)+sum(nums)= (min(nums) + k)* n = min(nums) *n + k*n

    公式展开变换后得k:

    sum(nums)-min(nums)*n

    class Solution:
        def minMoves(self, nums: List[int]) -> int:
            return sum(nums)-min(nums)*len(nums) if len(nums) != 1 else 0
  • 相关阅读:
    PHP处理字符中的emoji表情
    CentOS 7 安装 PHP7.2 (LNMP环境搭建第二步)
    php 二维数组按某个字段排序
    JavaScript返回到上一页的方法
    常用正则表达式—手机号码
    JS实现斐波那契列数的三种方法
    常用正则表达式--金额
    PHP中三种设置脚本最大执行时间的方法
    生成指定长度随机字符串
    API常用签名验证方法(PHP实现)
  • 原文地址:https://www.cnblogs.com/LLLLgR/p/14729637.html
Copyright © 2011-2022 走看看