当前位置: 首页 > article >正文

LeetCode 第2815题:数组中的最大数对和

LeetCode 第2815题:数组中的最大数对和

在本篇博客中,我们将深入探讨 LeetCode 第2815题:数组中的最大数对和。我们将详细解析题目描述,理解约束条件,并逐步讲解一个高效的 Python 解法,帮助你有效解决这一问题。

题目描述

给你一个下标从 0 开始的整数数组 nums。请你从 nums 中找出和 最大 的一对数,且这两个数数位上最大的数字相等。

返回 最大和,如果不存在满足题意的数字对,返回 -1

示例

示例 1:

输入:nums = [51,71,17,24,42]
输出:88
解释:
i = 1 和 j = 2,nums[i] 和 nums[j] 数位上最大的数字相等,且这一对的总和 71 + 17 = 88。
i = 3 和 j = 4,nums[i] 和 nums[j] 数位上最大的数字相等,且这一对的总和 24 + 42 = 66。
可以证明不存在其他数对满足数位上最大的数字相等,所以答案是 88。

示例 2:

输入:nums = [1,2,3,4]
输出:-1
解释:不存在数对满足数位上最大的数字相等。

约束条件

  • 2 <= nums.length <= 100
  • 1 <= nums[i] <= 10^4

解题思路

这道题目要求我们在数组 nums 中找到一对数,使得这对数中每个数的数位上最大的数字相等,并且这对数的和尽可能大。如果不存在这样的数对,则返回 -1

为了高效地解决这个问题,我们可以按照以下步骤进行:

  1. 确定每个数的数位上最大的数字
    对于数组中的每个数,我们需要找出其数位上的最大数字。例如,数 71 的数位上最大的数字是 7

  2. 记录每个最大数字对应的最大数
    我们可以使用一个长度为 10 的数组 max_ 来记录每个可能的最大数字(0-9)对应的最大数。初始化时,将所有位置设为负无穷大,以便后续比较。

  3. 遍历数组,更新 max_ 并计算可能的最大和
    对于数组中的每个数 x,我们首先找到它数位上的最大数字 a。然后,我们检查当前 a 对应的 max_[a] 是否已经存在一个数,如果存在,我们可以计算 max_[a] + x 并更新答案。接着,我们更新 max_[a] 为当前数 x 的最大值。

  4. 返回结果
    最后,如果找到符合条件的数对,则返回最大的和;否则,返回 -1

关键点

  • 数位上最大的数字:对于每个数,我们需要找出其数位上的最大数字。这可以通过将数转换为字符串后逐位比较得到。
  • 记录最大值:使用一个数组 max_ 来记录每个可能的最大数字对应的最大数,可以在遍历过程中快速查找和更新。
  • 时间复杂度:由于遍历数组一次,每个操作都是常数时间,因此整体时间复杂度为 O(n),其中 n 是数组的长度。

代码实现

以下是基于上述思路的 Python 实现:

from typing import List

class Solution:
    def maxSum(self, nums: List[int]) -> int:
        ans = -1
        max_ = [float('-inf')] * 10  # 初始化最大值数组,索引代表最大数字(0-9)
        for x in nums:
            # 找出数x数位上的最大数字a
            a = max(int(digit) for digit in str(x))
            # 如果当前a已经有记录的最大数,计算当前和并更新答案
            if max_[a] != float('-inf'):
                ans = max(ans, max_[a] + x)
            # 更新max_[a]为当前数x和之前记录的最大数中的较大者
            max_[a] = max(max_[a], x)
        return ans

代码解析

  1. 导入必要的模块

    from typing import List
    
    • List 用于类型注解,增强代码的可读性和可维护性。
  2. 定义 Solution 类和 maxSum 方法

    class Solution:
        def maxSum(self, nums: List[int]) -> int:
            ans = -1
            max_ = [float('-inf')] * 10
            for x in nums:
                a = max(int(digit) for digit in str(x))
                if max_[a] != float('-inf'):
                    ans = max(ans, max_[a] + x)
                max_[a] = max(max_[a], x)
            return ans
    
    • ans 初始化为 -1,用于记录最终的最大和。
    • max_ 是一个长度为 10 的数组,用于记录每个可能的最大数字(0-9)对应的最大数,初始值设为负无穷大。
    • 遍历数组 nums 中的每个数 x
      • 将数 x 转换为字符串,并逐位比较找出其中最大的数字 a
      • 如果 max_[a] 已经有记录(即不是负无穷大),则计算 max_[a] + x 并更新 ans
      • 更新 max_[a] 为当前数 x 和之前记录的 max_[a] 中的较大者。

示例讲解

示例 1:

输入:nums = [51,71,17,24,42], k = 10
输出:88
  • 步骤

    1. x = 51,最大数字 a = 5max_[5] = max(-inf, 51) = 51
    2. x = 71,最大数字 a = 7max_[7] = max(-inf, 71) = 71
    3. x = 17,最大数字 a = 7max_[7] 已有 71,计算 71 + 17 = 88,更新 ans = 88。然后更新 max_[7] = max(71, 17) = 71
    4. x = 24,最大数字 a = 4max_[4] = max(-inf, 24) = 24
    5. x = 42,最大数字 a = 4max_[4] 已有 24,计算 24 + 42 = 66ans 保持为 88。然后更新 max_[4] = max(24, 42) = 42
  • 结果:最终 ans = 88

示例 2:

输入:nums = [1,2,3,4], k = 1
输出:-1
  • 步骤

    1. x = 1,最大数字 a = 1max_[1] = max(-inf, 1) = 1
    2. x = 2,最大数字 a = 2max_[2] = max(-inf, 2) = 2
    3. x = 3,最大数字 a = 3max_[3] = max(-inf, 3) = 3
    4. x = 4,最大数字 a = 4max_[4] = max(-inf, 4) = 4
  • 结果:没有找到任何数对满足数位上最大的数字相等,因此返回 -1

复杂度分析

  • 时间复杂度:O(n),其中 n 是数组 nums 的长度。

    • 我们只需要遍历数组一次,每次操作都是常数时间。
  • 空间复杂度:O(1)。

    • 我们使用了一个长度固定为 10 的数组 max_,不随输入规模变化。

总结

本题要求我们在数组中找到一对数,使得这对数中每个数的数位上最大的数字相等,并且这对数的和尽可能大。通过以下步骤,我们能够高效地解决问题:

  1. 确定每个数的数位上最大的数字
  2. 使用一个固定大小的数组记录每个最大数字对应的最大数
  3. 在遍历过程中更新记录并计算可能的最大和

这种方法不仅简单直观,而且在时间和空间复杂度上都非常高效,适用于处理题目中给定的约束条件。如果你有任何疑问或更优化的解法,欢迎在评论区交流分享!


http://www.kler.cn/a/511773.html

相关文章:

  • [gdb调试] gdb调试基础实践gdb指令汇总
  • 浅说树上倍增(下)
  • AIGC视频生成模型:Meta的Emu Video模型
  • 21.1、网络设备安全概述
  • MySQL课堂练习(多表查询练习)
  • ESP8266-01S、手机、STM32连接
  • 有效的数独
  • 基于深度学习的微出血自动检测及解剖尺度定位|文献速递-视觉大模型医疗图像应用
  • 《鸿蒙Next应用商店:人工智能开启智能推荐与运营新时代》
  • 学习记录之原型,原型链
  • SDL2:PC端编译使用 -- SDL2多媒体库使用音频实例
  • 【Vscode】Vscode不能执行vue脚本的原因及解决方法
  • 2024年度数据科学与机器学习技术总结
  • Java 中求两个 List集合的交集元素
  • MECD+: 视频推理中事件级因果图推理--VLM长视频因果推理
  • Windows11电脑总是一闪一闪的,黑一下亮一些怎么解决
  • node.js 文件操作
  • 解决MAC安装软件时提示“xxx.app 显示已损坏”的方法
  • 抽奖系统(4——活动模块)
  • 网页固件升级界面设计
  • 【Maven】resources-plugin
  • vue3-sfc-loader 加载远程.vue文件(sfc)案例
  • React总结
  • 合合信息DocFlow产品解析与体验:人人可搭建的AI自动化单据处理工作流
  • UE虚幻引擎No Google Play Store Key:No OBB found报错如何处理?
  • 【spring boot统一功能处理】拦截器