【算法千题案例】⚡️每日LeetCode打卡⚡️——56.最小操作次数使数组元素相等

简介: 📢前言🌲原题样例:找到所有数组中消失的数字🌻C#方法:排序🌻Java 方法一:暴力法 【超时】🌻Java 方法二:动态规划💬总结

📢前言

🚀 算法题 🚀

🌲 每天打卡一道算法题,既是一个学习过程,又是一个分享的过程😜

🌲 提示:本专栏解题 编程语言一律使用 C# 和 Java 两种进行解题

🌲 要保持一个每天都在学习的状态,让我们一起努力成为算法大神吧🧐!

🌲 今天是力扣算法题持续打卡第56天🎈!

🚀 算法题 🚀

🌲原题样例:找到所有数组中消失的数字

给你一个长度为n 的整数数组,每次操作将会使 n - 1个元素增加1。返回让数组所有元素相等的最小操作次数。


示例:

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

示例 2:

输入:nums = [1,1,1]
输出:0

提示:


n == nums.length

1 <= nums.length <= 105

-109 <= nums[i] <= 109

答案保证符合 32-bit 整数

🌻C#方法:排序

使用return nums.Sum() - nums.Min() * nums.Length;就可以搞定,但是Sum会溢出


所以修改为以下代码,遍历一遍即可!


代码:

public class Solution {
    public int MinMoves(int[] nums) {
             int iSum = nums.Min() * nums.Length * -1;
            foreach (var num in nums)
            {
                iSum += num;
            }
            return iSum;
    }
}

执行结果

通过
执行用时:156 ms,在所有 C# 提交中击败了53.85%用户
内存消耗:48.1 MB,在所有 C# 提交中击败了23.08%的用户

🌻Java 方法一:暴力法 【超时】

思路解析


首先,我们知道,为了在最小移动内使所有元素相等,我们需要在数组的最大元素之外的所有元素中执行增加。


因此,在暴力法中,我们扫描整个数组以查找最大值和最小元素。


此后,我们将 111 添加到除最大元素之外的所有元素,并增加移动数的计数。


同样,我们重复相同的过程,直到最大元素和最小元素彼此相等。


代码:

public class Solution {
    public int minMoves(int[] nums) {
        int min = 0, max = nums.length - 1, count = 0;
        while (true) {
            for (int i = 0; i < nums.length; i++) {
                if (nums[max] < nums[i]) {
                    max = i;
                }
                if (nums[min] > nums[i]) {
                    min = i;
                }
            }
            if (nums[max] == nums[min]) {
                break;
            }
            for (int i = 0; i < nums.length; i++) {
                if (i != max) {
                    nums[i]++;
                }
            }
            count++;
        }
        return count;
    }
}

执行结果

超时

复杂度分析

时间复杂度:O( n^2 k ),其中 n 为数组长度,k 为最大值和最小值的差。
空间复杂度:O( 1)

🌻Java 方法二:动态规划

思路解析

image.png

代码:

public class Solution {
    public int minMoves(int[] nums) {
        Arrays.sort(nums);
        int moves = 0;
        for (int i = 1; i < nums.length; i++) {
            int diff = (moves + nums[i]) - nums[i - 1];
            nums[i] += moves;
            moves += diff;
        }
        return moves;
    }
}

执行结果

通过
执行用时:13 ms,在所有 Java  提交中击败了20.05%的用户
内存消耗:38.6 MB,在所有 Java 提交中击败了92.21%的用户

复杂度分析

时间复杂度:O( nlog(n) )
空间复杂度:O( 1)

💬总结

  • 今天是力扣算法题打卡的第五十六天!
  • 文章采用 C#Java 两种编程语言进行解题
  • 一些方法也是参考力扣大神写的,也是边学习边分享,再次感谢算法大佬们
  • 那今天的算法题分享到此结束啦,明天再见!


相关文章
【力扣】-- 移除链表元素
【力扣】-- 移除链表元素
195 1
|
5月前
|
存储 人工智能 算法
从零掌握贪心算法Java版:LeetCode 10题实战解析(上)
在算法世界里,有一种思想如同生活中的"见好就收"——每次做出当前看来最优的选择,寄希望于通过局部最优达成全局最优。这种思想就是贪心算法,它以其简洁高效的特点,成为解决最优问题的利器。今天我们就来系统学习贪心算法的核心思想,并通过10道LeetCode经典题目实战演练,带你掌握这种"步步为营"的解题思维。
|
11月前
|
机器学习/深度学习 存储 算法
【LeetCode 热题100】347:前 K 个高频元素(详细解析)(Go语言版)
这篇文章详细解析了力扣热题 347——前 K 个高频元素的三种解法:哈希表+小顶堆、哈希表+快速排序和哈希表+桶排序。每种方法都附有清晰的思路讲解和 Go 语言代码实现。小顶堆方法时间复杂度为 O(n log k),适合处理大规模数据;快速排序方法时间复杂度为 O(n log n),适用于数据量较小的场景;桶排序方法在特定条件下能达到线性时间复杂度 O(n)。文章通过对比分析,帮助读者根据实际需求选择最优解法,并提供了完整的代码示例,是一篇非常实用的算法学习资料。
646 90
|
9月前
|
Go
【LeetCode 热题100】DP 实战进阶:最长递增子序列、乘积最大子数组、分割等和子集(力扣300 / 152/ 416 )(Go语言版)
本文深入解析三道经典的动态规划问题:**最长递增子序列(LIS)**、**乘积最大子数组** 和 **分割等和子集**。 - **300. LIS** 通过 `dp[i]` 表示以第 `i` 个元素结尾的最长递增子序列长度,支持 O(n²) 动态规划与 O(n log n) 的二分优化。 - **152. 乘积最大子数组** 利用正负数特性,同时维护最大值与最小值的状态转移方程。 - **416. 分割等和子集** 转化为 0-1 背包问题,通过布尔型 DP 实现子集和判断。 总结对比了三题的状态定义与解法技巧,并延伸至相关变种问题,助你掌握动态规划的核心思想与灵活应用!
363 1
【LeetCode 27】347.前k个高频元素
【LeetCode 27】347.前k个高频元素
163 0
|
存储 监控 算法
关于员工上网监控系统中 PHP 关联数组算法的学术解析
在当代企业管理中,员工上网监控系统是维护信息安全和提升工作效率的关键工具。PHP 中的关联数组凭借其灵活的键值对存储方式,在记录员工网络活动、管理访问规则及分析上网行为等方面发挥重要作用。通过关联数组,系统能高效记录每位员工的上网历史,设定网站访问权限,并统计不同类型的网站访问频率,帮助企业洞察员工上网模式,发现潜在问题并采取相应管理措施,从而保障信息安全和提高工作效率。
201 7
|
存储 人工智能 算法
C 408—《数据结构》算法题基础篇—数组(通俗易懂)
408考研——《数据结构》算法题基础篇之数组。(408算法题的入门)
795 23
|
算法 程序员 索引
数据结构与算法学习七:栈、数组模拟栈、单链表模拟栈、栈应用实例 实现 综合计算器
栈的基本概念、应用场景以及如何使用数组和单链表模拟栈,并展示了如何利用栈和中缀表达式实现一个综合计算器。
287 1
数据结构与算法学习七:栈、数组模拟栈、单链表模拟栈、栈应用实例 实现 综合计算器
|
存储 算法 Java
leetcode算法题-有效的括号(简单)
【11月更文挑战第5天】本文介绍了 LeetCode 上“有效的括号”这道题的解法。题目要求判断一个只包含括号字符的字符串是否有效。有效字符串需满足左括号必须用相同类型的右括号闭合,并且左括号必须以正确的顺序闭合。解题思路是使用栈数据结构,遍历字符串时将左括号压入栈中,遇到右括号时检查栈顶元素是否匹配。最后根据栈是否为空来判断字符串中的括号是否有效。示例代码包括 Python 和 Java 版本。
363 4
|
算法
每日一道算法题(Leetcode 20)
每日一道算法题(Leetcode 20)
222 2

热门文章

最新文章