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

文章目录

  • 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++ 的用户

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

Ubuntu(Linux)的基本操作

基本操作三步走 1、输入vim code.c点击i&#xff08;出现insert&#xff09;表示可以编辑代码编辑代码之后按下esc&#xff08;退出编辑模式&#xff09;按下shift:&#xff08;冒号&#xff09;wq&#xff08;退出文件&#xff09;2、输入gcc code.c&#xff08;进行编译代码…

为什么求职者反感企业招聘用的人才测评?

为什么求职者会对人才测评的不满&#xff1f;大概率是认为性格测评不能完整的定义人的优势&#xff0c;也就是测不准&#xff01; 这个想法是对的&#xff0c;性格测评并不能100%的展现一个完整的人&#xff0c;目前没有那个测评的信效度能达到如此理想&#xff0c;估计以后也…

⑩⑤【DB】详解MySQL存储过程:变量、游标、存储函数、循环,判断语句、参数传递..

个人简介&#xff1a;Java领域新星创作者&#xff1b;阿里云技术博主、星级博主、专家博主&#xff1b;正在Java学习的路上摸爬滚打&#xff0c;记录学习的过程~ 个人主页&#xff1a;.29.的博客 学习社区&#xff1a;进去逛一逛~ MySQL存储过程 1. 介绍2. 使用3. 变量①系统变…

【kafka】使用docker启动kafka

1.环境准备 docker拉取zookeeper镜像 docker pull zookeeper:3.4.14 创建zookeeper容器&#xff0c;默认端口号为2181 docker run -d --name zookeeper -p 2181:2181 zookeeper:3.4.14 拉取kafka镜像 docker pull wurstmeister/kafka:2.12-2.3.1 创键kafka容器&#xff…

Linux | C语言中volatile关键字的理解

目录 前言 一、代码引入 二、现象解释 三、具体引用 前言 本章主要讲解介绍volatile关键的作用与使用场合&#xff1b;深刻理解volatile关键字&#xff1b;本文你需要有信号相关的基础知识&#xff1b; Linux | 信号-CSDN博客 一、代码引入 首先&#xff0c;我们来查看下面…

【文末附资料链接】2023年第十三届亚太杯数学建模竞赛(APMCM)优秀参考论文思路指导(持续更新中ing)

一、赛事介绍 数学建模作为一门跨学科的科学&#xff0c;不仅需要对数学知识的熟练掌握&#xff0c;还需要对实际问题的深刻理解和解决问题的创新思维。亚太杯数学建模竞赛旨在激发青年学子的创造力和团队协作精神&#xff0c;培养其在实际问题中运用数学方法解决现实挑战的能力…

介绍交换空间概念以及如何设置交换空间

文章目录 什么交换空间新增交换空间 什么交换空间 交换空间&#xff08;Swap space&#xff09;是计算机内存的一种补充&#xff0c;位于硬盘驱动器上。当物理内存不足时&#xff0c;系统会将不活跃的页面移到交换空间中。 交换空间可以帮助系统在以下情况下运行&#xff1a…

devops底层是怎么实现的

DevOps的3大核心基础架构 简而言之&#xff0c;实现DevOps工具链&#xff0c;基本需要3个核心基础架构&#xff1a; SCM配置管理系统 Automation自动化系统 Cloud云&#xff08;或者说可伸缩的、自服务的、虚拟化系统&#xff09; SCM配置管理系统 SCM中所放置的内容又可以再…

[ 一刷完结撒花!! ] Day50 力扣单调栈 : 503.下一个更大元素II |42. 接雨水 | 84.柱状图中最大的矩形

Day50 力扣单调栈 : 503.下一个更大元素II &#xff5c;42. 接雨水 | 84.柱状图中最大的矩形 503.下一个更大元素II第一印象看完题解的思路实现中的困难感悟代码 42. 接雨水第一印象看完题解的思路暴力解法单调栈解法 实现中的困难感悟代码 84.柱状图中最大的矩形第一印象看完…

计算机视觉与机器学习D1

计算机视觉简介 技术背景 了解人工智能方向、热点 目前人工智能的技术方向有&#xff1a; 1、计算机视觉——计算机视觉(CV)是指机器感知环境的能力&#xff1b;这一技术类别中的经典任务有图像形成、图像处理、图像提取和图像的三维推理。物体检测和人脸识别是其比较成功…

Ubuntu20.04 安装微信 【wine方式安装】推荐

安装步骤: 第一步:安装 WineHQ 安装包 先安装wine,根据官网指导安装即可。下载 - WineHQ Wikihttps://wiki.winehq.org/Download_zhcn 如果您之前安装过来自其他仓库的 Wine 安装包,请在尝试安装 WineHQ 安装包之前删除它及依赖它的所有安装包(如:wine-mono、wine-gec…

深度学习二维码识别 计算机竞赛

文章目录 0 前言2 二维码基础概念2.1 二维码介绍2.2 QRCode2.3 QRCode 特点 3 机器视觉二维码识别技术3.1 二维码的识别流程3.2 二维码定位3.3 常用的扫描方法 4 深度学习二维码识别4.1 部分关键代码 5 测试结果6 最后 0 前言 &#x1f525; 优质竞赛项目系列&#xff0c;今天…

C++多线程编程(1):线程的创建方式

文章首发于我的个人博客&#xff1a;欢迎大佬们来逛逛 文章目录 进行与线程C中如何实现多线程创建线程的多种方式无参函数lambda表达式常成员函数not常成员引用函数智能指针仿函数类的普通成员函数综合测试 进行与线程 多线程是指多个线程并发执行的过程。 进程与线程的关系&…

使用Qt实现多人聊天工作室

目录 1、项目背景 2、技术分析 3、架构设计 3、1 服务器架构 3.1.1 模块划分 3.1.2 模块之间的交互 3、2 客户端架构 3.2.1 模块划分 3.2.2 模块之间交互 4、实现过程 4、1 功能实现 4.1.1 用户登录注册功能​编辑 4.1.2 用户主界面功能 4、2 设计实现 4.2.1 登录…

传输层协议-TCP协议

目录 TCP协议格式理解可靠性序号与确认序号16位窗口大小六个标志位连接管理机制三次握手四次挥手 确认应答机制&#xff08;ACK&#xff09;超时空重传机制流量控制滑动窗口拥塞控制延迟应答捎带应答面向字节流粘包问题TCP异常情况TCP小结基于TCP应用层协议TCP/UDP对比用UDP实现…

程序的编译链接以及装载

目录 一、预处理 二、编译 三、汇编 四、链接 五、装载 一、预处理 读取c源程序&#xff0c;对其中的伪指令&#xff08;以#开头的指令&#xff09;和特殊符号进行处理&#xff0c; 伪指令主要包括以下五个方面&#xff1a; 宏定义指令&#xff0c;如#define Name Token…

如何定位el-tree中的树节点当父元素滚动时如何定位子元素

使用到的方法 Element 接口的 scrollIntoView() 方法会滚动元素的父容器&#xff0c;使被调用 scrollIntoView() 的元素对用户可见。 参数 alignToTop可选 一个布尔值&#xff1a; 如果为 true&#xff0c;元素的顶端将和其所在滚动区的可视区域的顶端对齐。相应的 scrollIntoV…

基于冠状病毒群体免疫算法优化概率神经网络PNN的分类预测 - 附代码

基于冠状病毒群体免疫算法优化概率神经网络PNN的分类预测 - 附代码 文章目录 基于冠状病毒群体免疫算法优化概率神经网络PNN的分类预测 - 附代码1.PNN网络概述2.变压器故障诊街系统相关背景2.1 模型建立 3.基于冠状病毒群体免疫优化的PNN网络5.测试结果6.参考文献7.Matlab代码 …

再高级的打工人也只是打工人!

再高级的打工人也只是打工人&#xff01; OpenAI CEO 奥特曼被罢免的事情人尽皆知「虽然&#xff0c;今天又复职了。。」&#xff0c;我们能从中学到什么呢&#xff1f; CEO 也能被裁&#xff0c;这应该是最近几年被裁名单里面&#xff0c;职级最高的一个人了吧。你再也不用担…

2023最新最全【Nacos】零基础安装教程

一、下载Nacos1.4.1 二、单机版本安装 2.1 将下载的nacos安装包传输到服务器2.2 解压文件2.3 进入bin目录下 单机版本启动2.4 关闭nacos2.5 访问Nacos地址 IP&#xff1a;8848/nacos 三、集群版本的安装 3.1 复制nacos安装包&#xff0c;修改为nacos8849&#xff0c;nacos88…