zoukankan      html  css  js  c++  java
  • LeetCode算法题-Minimum Moves to Equal Array Elements(Java实现)

    这是悦乐书的第233次更新,第246篇原创

    01 看题和准备

    今天介绍的是LeetCode算法题中Easy级别的第100题(顺位题号是453)。给定大小为n的非空整数数组,找到使所有数组元素相等所需的最小移动数,其中移动将n-1个元素递增1。例如:

    输入:[1,2,3]
    输出:3
    说明:只需要三个动作(记住每个动作增加两个元素):
    [1,2,3] => [2,3,3] => [3,4,3] => [4,4,4]

    本次解题使用的开发工具是eclipse,jdk使用的版本是1.8,环境是win7 64位系统,使用Java语言编写和测试。

    02 第一种解法

    特殊情况:如果nums中没有任何元素,直接返回0。

    正常情况:每次使n-1个元素增加1,最后使得每个元素都相等,这与每次使一个元素减1,最后使得全部元素等于数组中的最小值是一样的效果。所以,我们可以先将数组中的最小值找到,然后用数组中的每个元素去减最小值,得到的差进行累加,最后的和就是最小移动步数。

    public int minMoves(int[] nums) {
        if (nums.length == 0) {
            return 0;
        }
        int minNum = nums[0];
        for (int n : nums) {
            minNum = Math.min(minNum, n);
        }
        int result = 0;
        for (int n : nums) {
            result += n - minNum;
        }
        return result;
    }
    

    03 第二种解法

    将sum定义为数组所有元素之和,minNum作为数组中的最小数字,n是数组的长度,移动m步,最后得到所有数字为x,我们将得到以下等式:

    sum + m ×(n - 1)= x × n

    实际上,

    x = minNum + m

    最后,我们会得到

    m = sum - minNum × n

    以上的推导过程大家可以使用归纳法,多列举些例子进行推导。因此,我们只需要知道数组元素之和、数组元素最小值即可,就可以将最小步数求出来。

    public int minMoves2(int[] nums) {
        int sum = 0;
        int minNum = nums[0];
        for(int n : nums){
            sum += n;
            minNum = Math.min(minNum, n);
        }
        return sum - nums.length*minNum;
    }
    

    04 第三种解法

    此解法的思路和第二种解法的思路一致,只是获取数组中最小值时有一点差别。

    public int minMoves3(int[] nums) {
        int minNum = Integer.MAX_VALUE;
        int sum = 0;
        for (int n : nums) {
            if (n < minNum) {
                minNum = n;
            }
            sum += n;
        }
        return sum - minNum*nums.length;
    }
    

    05 第四种解法

    更加疯狂的解法,一行代码搞定,利用流的相关操作,但是思路和第二种、第三种解法是一样的。此解法的效率并没有比上面的解法高多少,只是种思路,实际开发中,使用第二种解法或者第三种解法即可。

    public int minMoves4(int[] nums) {
        return IntStream.of(nums).sum() - nums.length * IntStream.of(nums).min().getAsInt();
    }
    

    06 小结

    算法专题目前已日更超过三个月,算法题文章100+篇,公众号对话框回复【数据结构与算法】、【算法】、【数据结构】中的任一关键词,获取系列文章合集。

    以上就是全部内容,如果大家有什么好的解法思路、建议或者其他问题,可以下方留言交流,点赞、留言、转发就是对我最大的回报和支持!

  • 相关阅读:
    变量的含义,内存管理机制,数据类型的含义
    操作系统、应用程序的含义,编程语言的优缺点
    Pycharm常用快捷键
    计算机组成及原理
    仿酷狗音乐播放器开发日志——整体框架分析
    仿酷狗音乐播放器开发日志——整体框架分析
    c++与java的优缺点
    c++与java的优缺点
    unicode ansi utf-8 unicode_big_endian编码的区别
    unicode ansi utf-8 unicode_big_endian编码的区别
  • 原文地址:https://www.cnblogs.com/xiaochuan94/p/10280343.html
Copyright © 2011-2022 走看看