【Leetcode合集】2342. 数位和相等数对的最大和

news2024/11/17 7:51:37

文章目录

  • 2342. 数位和相等数对的最大和
    • 方案1
    • 方案2
    • 方案3
    • 方案4

2342. 数位和相等数对的最大和

2342. 数位和相等数对的最大和

代码仓库地址: https://github.com/slience-me/Leetcode
个人博客 :https://slienceme.xyz

给你一个下标从 0 开始的数组 nums ,数组中的元素都是 整数。请你选出两个下标 iji != j),且 nums[i] 的数位和 与 nums[j] 的数位和相等。

请你找出所有满足条件的下标 ij ,找出并返回 nums[i] + nums[j] 可以得到的 最大值

示例 1:

输入:nums = [18,43,36,13,7]
输出:54
解释:满足条件的数对 (i, j) 为:
- (0, 2) ,两个数字的数位和都是 9 ,相加得到 18 + 36 = 54 。
- (1, 4) ,两个数字的数位和都是 7 ,相加得到 43 + 7 = 50 。
所以可以获得的最大和是 54 。

示例 2:

输入:nums = [10,12,19,14]
输出:-1
解释:不存在满足条件的数对,返回 -1 。

提示:

  • 1 <= nums.length <= 105
  • 1 <= nums[i] <= 109

方案1

class Solution {
public:
    int maximumSum(vector<int> &nums) {
        vector<int> sumVector; // 创建一个空的整数向量,记录数位和
        int maxNum = -1;
        for (const auto &item: nums) {
            int num = getSumOfNum(item);
            sumVector.push_back(num);
        }
        for(int i=0; i<sumVector.size(); i++){
            for(int j=i+1; j<sumVector.size(); j++){
                if(sumVector[i] == sumVector[j]){
                    if(nums[i]+nums[j]>maxNum){
                        maxNum = nums[i]+nums[j];
                    }
                }
            }
        }
        return maxNum;

    }

    int getSumOfNum(int num) {
        int sum = 0; // 12345
        while (num != 0) {
            sum += (num % 10);
            num /= 10;
        }
        return sum;
    }
};

超出时间限制

在这里插入图片描述

方案2

在给定的代码中,您的目标是找到满足数位和相等的两个数的和的最大值。目前的方法是使用两层嵌套的循环来检查所有数对,并找到它们的数位和相等的情况下的最大和。
有一些地方可以进行优化来提高算法的效率:

  1. 使用哈希表存储数位和的索引: 可以使用哈希表(unordered_map)存储数位和及其对应的索引,这样可以在一次遍历中找到符合条件的数对。
  2. . 不需要构建额外的向量存储数位和: 在遍历原始数组时,直接计算数位和并在哈希表中查找,而不需要额外的向量来存储数位和。
class Solution {
public:
    int maximumSum(vector<int> &nums) {
        unordered_map<int, vector<int>> sumIndexMap;
        int maxSum = -1;

        for (int num : nums) {
            int sum = getSumOfNum(num);
            sumIndexMap[sum].push_back(num);
        }
        for (auto& pair : sumIndexMap) {
            if (pair.second.size() >= 2) {
                sort(pair.second.rbegin(), pair.second.rend());
                maxSum = max(maxSum, pair.second[0] + pair.second[1]);
            }
        }
        return maxSum;

    }
    int getSumOfNum(int num) {

        if (num < 0) {
            return -1;
        }
        int sum = 0; // 12345
        while (num != 0) {
            sum += (num % 10);
            num /= 10;
        }
        return sum;
    }
};

执行用时分布 208ms 击败16.01%使用 C++ 的用户

消耗内存分布 65.10MB 击败19.74%使用 C++ 的用户

方案3

单次循环解决问题,不再多一步排序

class Solution {
public:
    int maximumSum(vector<int> &nums) {
        unordered_map<int, int> sumIndexMap; //存储数位和对应索引
        int maxSum = -1; // 最大值
        // 先全部放入哈希表
        for (int num: nums) {
            int sum = getSumOfNum(num);
            if (sumIndexMap.count(sum)) {
                maxSum = max(maxSum, sumIndexMap[sum] + num);
                sumIndexMap[sum] = max(sumIndexMap[sum], num);
            } else {
                sumIndexMap[sum] = num;
            }
        }
        return maxSum;

    }
    int getSumOfNum(int num) {

        if (num < 0) {
            return -1;
        }
        int sum = 0; // 12345
        while (num != 0) {
            sum += (num % 10);
            num /= 10;
        }
        return sum;
    }
};

执行用时分布 144ms 击败66.89%使用 C++ 的用户

消耗内存分布 57.78MB 击败39.91%使用 C++ 的用户

方案4

纯属组解决问题

class Solution {
public:
    int maximumSum(vector<int> &nums) {
        int maxArray[120]={0}; //先给够
        int maxSum = -1; // 最大值
        // 先全部放入哈希表
        for (int num: nums) {
            int sum = getSumOfNum(num);
            if (maxArray[sum]) {
                maxSum = max(maxSum, maxArray[sum] + num);
                maxArray[sum] = max(maxArray[sum], num);
            } else {
                maxArray[sum] = num;
            }
        }
        return maxSum;

    }
    int getSumOfNum(int num) {

        if (num < 0) {
            return -1;
        }
        int sum = 0; // 12345
        while (num != 0) {
            sum += (num % 10);
            num /= 10;
        }
        return sum;
    }
};

执行用时分布 208ms 击败16.01%使用 C++ 的用户

消耗内存分布 65.10MB 击败19.74%使用 C++ 的用户

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1226827.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

单链表在线OJ题(详解+图解)

1.删除链表中等于给定值 val 的所有节点 本题的要求是输入一个val的整形值&#xff0c;若链表中节点存储的值与val相等&#xff0c;则删除这个节点&#xff0c;并最后返回这个删除节点后的链表&#xff0c;思路如下&#xff1a; 我们可以直接使用while循环&#xff0c;并且使用…

Python 如何实现职责链设计模式?什么是职责链设计模式?Python 职责链设计模式示例代码

什么是职责链&#xff08;Chain of Responsibility&#xff09;设计模式&#xff1f; 职责链&#xff08;Chain of Responsibility&#xff09;设计模式是一种行为型设计模式&#xff0c;旨在构建一个对象链&#xff0c;每个对象都有机会处理请求&#xff0c;并且可以将请求传…

基于stm32移植使用u8g2 库

前言 前面我已经写了如何使用stm32 使用软件IIC的方法驱动OLED&#xff0c;但是其实我们可以有更简单的使用方法&#xff0c;对于SSD1306 这款OLED 显示屏来说&#xff0c;其实已经有开源库可以直接使用了&#xff0c;我们只需要将对应的库移植过来&#xff0c;做一些简单的修改…

单片机课程设计——基于C51电子密码锁(源代码)

本设计是基于AT89C51单片机的电子密码锁设计&#xff0c;实现电子密码锁的基本功能。我们这里实现的是硬件仿真&#xff0c;关于软件仿真可以参考其他人的文章。 单片机课程设计--基于C51电子密码锁 效果展示 我们先来看效果展示&#xff0c;公主王子请看视频&#xff1a; 课…

【Spring总结】注解开发

本篇讲的内容主要是基于Spring v2.5的注解来完成bean的定义 之前都是使用纯配置的方式来定义的bean 文章目录 前言1. Spring v2.5 注解开发定义bean第一步&#xff1a;在需要定义的类上写上注解Component第二步&#xff1a;在Spring Config中定义扫描包第三步&#xff1a;主方法…

java springboot 在测试类中声明临时Bean对象

上文 java springboot在当前测试类中添加临时属性 不影响application和其他范围 中 我们讲了怎么在测试类中设置临时属性 但是 如果我们想设置临时的Bean呢&#xff1f; 其实做过几个项目的人都会理解 我们很多功能 需要一些第三方bean才能完成 那么 我们可能存在需要用第三方b…

图书管理系统(图文详解,附源码)

前言&#xff1a;本文旨在用面向对象的思想编程实现图书管理系统&#xff0c;功能包括增删查找&#xff0c;完整源码放在文末&#xff0c;大家有需自取 目录 一.整体框架 二.书籍和书架 书籍(Book) 书架(BookRack) 三.对书籍的相关操作 操作接口(IOperation) 新增图书(A…

项目点使用Redis作为缓存技术-自用

在spring boot项目中&#xff0c;使用缓存技术只需在项目中导入相关缓存技术的依赖包&#xff0c;并在启动类上使用EnableCaching开启缓存支持即可。 例如&#xff0c;使用Redis作为缓存技术&#xff0c;只需要导入Spring data Redis的maven坐标即可。 描述 使用Redis缓存高频数…

WSA子系统(一)

WSA子系统安装教程 Windows Subsystem for Android (WSA) 是微软推出的一项功能&#xff0c;它允许用户在 Windows 11 上运行 Android 应用程序。通过在 Windows 11 上引入 WSA&#xff0c;用户可以在其 PC 上轻松运行 Android 应用程序&#xff0c;从而扩展了用户的应用程序选…

RobotFramework之用例执行时添加命令行参数(十三)

学习目录 引言 标签tag 设置变量 随机执行顺序 设置监听器 输出日志目录和文件 引言 Robot Framework 提供了许多命令行选项&#xff0c;可用于控制测试用例的执行方式以及生成的输出。本节介绍一些常用的选项语法。 标签tag 之前文章我们介绍过&#xff0c;在测试套件…

Leetcode经典题目之“双指针交换元素“类题目

1 LC 27. 移除元素 class Solution {public int removeElement(int[] nums, int val) {int nnums.length;int s0;for(int i0;i<n;i){// 只有不等于目标值的时候才会进行交换&#xff0c;然后移动s指针if(nums[i]!val){swap(nums,i,s);}}return s;}void swap(int[]nums, int…

(数据结构)算法的时间复杂度

注意语句频度和时间复杂度的区别&#xff0c;语句频度是指语句执行的次数&#xff0c;不可以像时间复杂度一样近似次数和省略常数项

在线识别二维码工具

具体请前往&#xff1a;在线二维码识别解码工具--在线识别并解码二维码网址等内容

FlinkCDC数据实时同步Mysql到ES

考大家一个问题&#xff0c;如果想要把数据库的数据同步到别的地方,比如es,mongodb,大家会采用哪些方案呢&#xff1f; ::: 定时扫描同步&#xff1f; 实时日志同步? 定时同步是一个很好的方案&#xff0c;比较简单&#xff0c;但是如果对实时要求比较高的话&#xff0c;定…

HFSS螺旋线圈的设计与仿真

HFSS螺旋线圈的设计与仿真 HFSS中设计螺旋线圈的方法&#xff1a;参考文献&#xff1a; HFSS中设计螺旋线圈的方法&#xff1a; 打开软件Ansys Eletronics Desktop 2022 R1&#xff0c; 建立工程&#xff0c; File/New 插入HFSS设计&#xff0c; Project/Insert HFSS Design …

【Spring】之初识

未来的几周时间&#xff0c;大概率我会更新一下Spring家族的一些简单知识。而什么是Spring家族&#xff0c;好多同学还不是很清楚&#xff0c;我先来简单介绍一下吧&#xff1a; 所谓Spring家族&#xff0c;它其实就是一个框架&#xff0c;是基于Servlet再次进行封装的内容。为…

大模型的交互能力

摘要&#xff1a; 基础大模型显示出明显的潜力&#xff0c;可以改变AI系统的开发人员和用户体验&#xff1a;基础模型降低了原型设计和构建AI应用程序的难度阈值&#xff0c;因为它们在适应方面的样本效率&#xff0c;并提高了新用户交互的上限&#xff0c;因为它们的多模式和生…

笔记55:长短期记忆网络 LSTM

本地笔记地址&#xff1a;D:\work_file\DeepLearning_Learning\03_个人笔记\3.循环神经网络\第9章&#xff1a;动手学深度学习~现代循环神经网络 a a a a a a a a a

jbase打印完善

上一篇实现了粗略的打印元素绘制协议&#xff0c;并且写了打印示例和导出示例&#xff0c;趁着空隙时间完善一下打印。 首先元素构造函数默认初始化每个字段值 package LIS.Core.Dto;/*** 打印约定元素*/ public class PrintElement {/*** 元素类型*/public String PrintType…

OpenCV快速入门:图像形态学操作

文章目录 前言一、图像形态学基础1.1 背景介绍1.2 像素距离1.2.1 什么是像素距离&#xff1f;1.2.2 常见的像素距离度量方法1.2.3 计算像素距离的代码实现 1.3 图像连通性1.3.1 什么是图像连通性&#xff1f;1.3.2 连通类型1.3.3 连通组件标记1.3.4 连通性在图像处理中的应用 1…