LeetCode题目笔记——1814. 统计一个数组中好对子的数目

news2024/9/30 5:30:56

文章目录

    • 题目描述
    • 题目难度——中等
    • 方法一:模拟(超时)(参考)
      • 代码/Python
    • 方法二:优化
      • 代码
    • 总结

题目描述

给你一个数组 nums ,数组中只包含非负整数。定义 rev(x) 的值为将整数 x 各个数字位反转得到的结果。比方说 rev(123) = 321 , rev(120) = 21 。我们称满足下面条件的下标对 (i, j) 是 好的 :

  • 0 <= i < j < nums.length
  • nums[i] + rev(nums[j]) == nums[j] + rev(nums[i])
    请你返回好下标对的数目。由于结果可能会很大,请将结果对 109 + 7 取余 后返回。

示例1:

输入:nums = [42,11,1,97]
输出:2
解释:两个坐标对为:
(0,3):42 + rev(97) = 42 + 79 = 121, 97 + rev(42) = 97 + 24 = 121 。
(1,2):11 + rev(1) = 11 + 1 = 12, 1 + rev(11) = 1 + 11 = 12 。

示例2:

输入:nums = [13,10,35,24,76]
输出:4

提示:

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

题目难度——中等

方法一:模拟(超时)(参考)

  根据根据题意,我们可以按照他的要求模拟这一过程,首先新建一个数组,然后求每个数的反转数,再用两个循环找满足要求的下标对。根据提示最多有100000个数据,因此肯定会超时。在本地测试105个数据的话,需要10多秒钟。

代码/Python

class Solution:
    def countNicePairs(self, nums: List[int]) -> int:
        n = len(nums)
        revNums = [0] * n
        for i in range(n):
            tmp = nums[i]
            x = 0
            while tmp != 0:
                x = x * 10 + tmp % 10
                tmp //= 10
            revNums[i] = x
        
        res = 0
        for i in range(n):
            for j in range(i + 1, n):
                if nums[i] - revNums[i] == nums[j] - revNums[j]:
                    res += 1
        
        return res

方法二:优化

  再看一下题目中的等式,我们合并一下同类项,把i和j都移到同一侧,就变成了nums[i] - rev(nums[i]) == nums[j] - rev(nums[j]),说明我们可以直接在原数组上对每个元素减去它本身的反数。再看超时问题,我们需要很快的访问,所以可以用一个哈希表来记录每个数字出现的次数,根据规律,出现两次则下标对就是1,三次就是2,以此类推,所以我们让答案加上counter[x] - 1.

代码

class Solution:
    def countNicePairs(self, nums: List[int]) -> int:
        size = len(nums)
        for i, x in enumerate(nums):
            tmp = 0
            while x != 0:
                tmp = tmp * 10 + x % 10
                x //= 10
            nums[i] -= tmp
        
        res = 0
        counter = defaultdict(int)
        for i, x in enumerate(nums):
            counter[x] += 1
            res += counter[x] - 1

        return res % (10 ** 9 + 7)

在这里插入图片描述
  还是很慢,还可以优化,我们没必要每次counter[x]加一后让答案加一次,因为这样对某个counter[x]来说,他会是加一个等差数列,我们直接用等差数列的求和公式。

class Solution:
    def countNicePairs(self, nums: List[int]) -> int:
        size = len(nums)
        for i, x in enumerate(nums):
            tmp = 0
            while x != 0:
                tmp = tmp * 10 + x % 10
                x //= 10
            nums[i] -= tmp
        
        res = 0
        counter = defaultdict(int)
        for i, x in enumerate(nums):
            counter[x] += 1
        
        for v in counter.values():
            res += (1 + v - 1) * (v - 1) // 2

        return res % (10 ** 9 + 7)

在这里插入图片描述
  还是慢,我们还可以继续优化。有三次循环,我们可以想办法在一个循环里解决。回到原题目,左右相等,其实我们可以根本不管他们具体的值是多少,只用关心它们的出现次数就好,还是用哈希表,对每个x,记录x-rev(x)的出现次数,然后像上面那样更新答案。

class Solution:
    def countNicePairs(self, nums: List[int]) -> int:
        size = len(nums)
        occurs = defaultdict(int)
        res = 0
        for i, x in enumerate(nums):
            rev = int(str(x)[::-1])
            res += occurs[x - rev]
	        occurs[x - rev] += 1

        return res % (10 ** 9 + 7)

在这里插入图片描述

总结

  暴力的复杂度是O(N2),优化后能达到O(N)。用到了字典,所以空间是O(N)。

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

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

相关文章

Kong Api Gateway

Kong Api Gateway什么是API 网关为什么是 Kong安装Kong通过包管理器来安装启动Kong配置文件详解1、常规配置2、Nginx注入配置3、数据库存储配置4、数据库缓存配置DNS解析器配置其他杂项配置API 管理详解1、查看节点信息2、查看节点状态3、添加服务4、查询服务5、查询所有服务6、…

golang入门笔记——Hertz

文章目录Hertz介绍应用层路由层协议层传输层HZ脚手架Hertz的使用一个简单的案例&#xff1a;利用Hertz监听8080端口并编写/ping的get处理函数Hertz和gin一样&#xff0c;提供了分组路由的功能Hertz路由的匹配优先级&#xff1a;静态路由>命名路由>通配路由参数绑定&#…

SD卡读写实验(SPI模式)

对于 SD 卡的 SPI 模式而言&#xff0c;采用的 SPI 的通信模式为模式 3&#xff0c;即 CPOL1&#xff0c;CPHA1&#xff0c;在 SD 卡 2.0 版本协议中&#xff0c;SPI_CLK 时钟频率可达 50Mhz。SD 卡的 SPI 模式&#xff0c;只用到了 SDIO_D3&#xff08;SPI_CS&#xff09;、SD…

16投影矩阵和最小二乘法

投影矩阵和最小二乘法 投影矩阵 **投影矩阵P与向量b相乘将会把投影到的列空间A中。**那么现在我们来考虑两个极端的例子&#xff0c;这两个极端的例子将会加深我们对投影矩阵的理解。 如果b在矩阵A的列空间里&#xff0c;那么 Pb b 如果b垂直于矩阵A的列空间&#xff0c;那…

经典同步问题

同步问题是一个复杂的问题&#xff0c;但是它也有自己的方法去处理、去分析。PV操作系统的解题思路&#xff1a;关系分析。找出题目中描述的各个进程&#xff0c;分析它们之间的同步、互斥关系。(从事件的角度分析)整理思路。根据各进程的操作流程确定P、V操作的大致顺序。设置…

Java设计模式-备忘录模式、备忘录模式应用场景是什么、又怎么使用

继续整理记录这段时间来的收获&#xff0c;详细代码可在我的Gitee仓库SpringBoot克隆下载学习使用&#xff01; 6.11 备忘录模式 6.11.1 定义 又称快照模式&#xff0c;在不破坏封装性的前提下&#xff0c;捕获一个对象的内部状态&#xff0c;并在该对象之外保存此状态&…

深入学习Vue.js(十一)内建组件和模块

文章目录KeepAlive组件的实现原理1.KeepAlive组件实现原理2.KeepAlive组件的代码实现&#xff08;1&#xff09;shouldKeepAlive&#xff08;2&#xff09;keepAliveInstance&#xff08;3&#xff09;keptAlive&#xff08;4&#xff09;move函数3.include和exclude4.缓存策略…

视频生成动画数据OpenPose+OpenCV

我们只是使用OpenPose&#xff0c;不包括深度学习和代码的部分&#xff0c;会用就OK。 1.打开OpenPose的官网&#xff0c;直接进入安装页面&#xff0c;地址如下&#xff1a; OpenPose: OpenPose Doc - Installation 2.安装的说明&#xff0c;大家要好好看&#xff0c;我们就…

吴恩达机器学习课程笔记:多元梯度下降法

1.吴恩达机器学习课程笔记&#xff1a;多元梯度下降法 笔记来源&#xff1a;吴恩达机器学习课程笔记&#xff1a;多元梯度下降法 仅作为个人学习笔记&#xff0c;若各位大佬发现错误请指正 1.1 多元特征&#xff08;变量&#xff09; 每一列代表一个特征&#xff0c;例如&…

【Github CLI】Take GitHub to the command line

目录儿~一、Git、Github、GitLab二、Github CLI——gh2.1 gh简介2.2 gh的使用2.21 Github身份验证&#xff08;必选&#xff09;2.22 常用命令&#xff08;1&#xff09;在Github仓库中打开当前项目&#xff08;2&#xff09;gh配置 gh config&#xff08;3&#xff09;克隆仓库…

(16)go-micro微服务jaeger链路追踪

文章目录一 jaeger链路追踪介绍什么是链路追踪&#xff1a;链路追踪主要功能&#xff1a;二 jaeger链路追踪作用三 jaeger链路追踪主要特性四 jaeger链路追踪原理图1.链路调用原理2. 一次调用链分析3.链路追踪存储与调用五 jaeger链路追踪五个重要组件六 jaeger链路追踪安装1.d…

Junit框架

JUnit 是一个 Java 编程语言的单元测试框架。环境配置创建maven项目&#xff0c;导入Junit配置<!-- https://mvnrepository.com/artifact/org.junit.jupiter/junit-jupiter-api --> <dependency><groupId>org.junit.jupiter</groupId><artifactId&g…

Linux常用命令——tail命令

在线Linux命令查询工具(http://www.lzltool.com/LinuxCommand) tail 在屏幕上显示指定文件的末尾若干行 补充说明 tail命令用于输入文件中的尾部内容。tail命令默认在屏幕上显示指定文件的末尾10行。如果给定的文件不止一个&#xff0c;则在显示的每个文件前面加一个文件名…

【docker概念和实践 4】 常见命令和案例(1)

一、说明 本篇讲述当Docker安装完成后&#xff0c;进行的由浅入深的操作过程。命令种类有&#xff1a;1 进程引擎进程命令 2帮助命令 3 镜像命令 4 容器命令 5 仓库命令。 二、关于操作引擎的指令 本节讲操作引擎的启动、关闭、维护等。以下两种形势都是等价的命令格式。 方法…

Java概览——Java运行机制

Java概览—Java运行机制Java的运行过程 Java程序运行时&#xff0c;必须经过编译和运行两个步骤。首先将后缀名为.java的源文件进行编译&#xff0c;最终生成后缀名为.class的字节码文件&#xff0c;然后Java虚拟机&#xff0c;将字节码文件进行解释执行&#xff0c;并将结果显…

Docker学习笔记【part1】概念与安装

一、Docker的概念 Docker 是实现系统平滑移植、容器虚拟化的技术&#xff0c;基于 Go语言&#xff0c;可以实现软件带环境安装&#xff0c;做到“一次镜像&#xff0c;处处运行”。Docker 是一个 C/S 模式的架构&#xff0c;后端是一个松耦合架构&#xff0c;众多模块各司其职…

九龙证券|次新股叠加智慧交通+信创+数字经济概念,开盘冲涨停!

核算机板块1月以来跑赢上证指数&#xff1b;才智交通、成绩高增及严重财物重组个股登上涨停榜。 证券时报•数据宝核算&#xff0c;1月19日&#xff0c;沪深两市收盘涨停股35只&#xff0c;其中ST股6只。群众交通、长久科技两股一字板强势涨停&#xff0c;潞安环能、跃岭股份收…

【MySQL】第五部分 多表查询

【MySQL】第五部分 多表查询 文章目录【MySQL】第五部分 多表查询5. 多表查询5.1 等值连接5.2 非等值连接5.3 自连接5.4 内连接5.5 外连接5.6 满外连接5.7 SQL99语法实现多表查询5.7.1 JOIN...ON语法5.7.2 使用SQL99语法实现内连接5.7.3 使用SQL99语法实现左外连接和右外连接5.…

postman入门

目录 新建界面 菜单区 百度翻译api实战 post 参数化 新建界面 1&#xff09;可以新建请求&#xff0c;&#xff08;rqueset&#xff09;模拟客户端的请求&#xff0c; 2&#xff09;可以创建测试集合&#xff08;collection&#xff09;&#xff0c;对接口请求进行统一管理…

删除排序链表中的重复元素

删除排序链表中的重复元素 题目描述 原始题目参考&#xff1a;删除有序链表的重复元素 给定一个已排序的链表的头 head &#xff0c; 删除原始链表中所有重复数字的节点&#xff0c;只留下不同的数字 。返回 已排序的链表 。 示例 1&#xff1a; 输入&#xff1a;head [1…