每日一道leetcode(2026.04.17):镜像对之间最小绝对距离

每日一道leetcode(2026.04.17):镜像对之间最小绝对距离

  • [1. 题目](#1. 题目)
  • [2. 分析](#2. 分析)
  • [3. 代码实现](#3. 代码实现)
  • [4. 总结](#4. 总结)

1. 题目

给你一个整数数组 nums。

镜像对 是指一对满足下述条件的下标 (i, j):

0 <= i < j < nums.length,并且 reverse(numsi) == numsj,其中 reverse(x) 表示将整数 x 的数字反转后形成的整数。反转后会忽略前导零,例如 reverse(120) = 21。 返回任意镜像对的下标之间的最小绝对距离。下标 i 和 j 之间的绝对距离为 abs(i - j)。

如果不存在镜像对,返回 -1。

示例 1:

输入: nums = 12,21,45,33,54

输出: 1

解释:

镜像对为:

(0, 1),因为 reverse(nums0) = reverse(12) = 21 = nums1,绝对距离为 abs(0 - 1) = 1。 (2, 4),因为 reverse(nums2) = reverse(45) = 54 = nums4,绝对距离为 abs(2 - 4) = 2。 所有镜像对中的最小绝对距离是 1。

示例 2:

输入: nums = 120,21

输出: 1

解释:

只有一个镜像对 (0, 1),因为 reverse(nums0) = reverse(120) = 21 = nums1

最小绝对距离是 1。

示例 3:

输入: nums = 21,120

输出: -1

解释:

数组中不存在镜像对。

提示:

1 <= nums.length <= 10e5

1 <= numsi <= 10e9

2. 分析

这道题我一开始的思路是按照最小距离做逐个遍历比较,比如,当前最小距离为1,用index为0的数值和0+1对应下标的数值比较,用index为1的数值和1+1对应下标的数值比较,如果遍历到最后也没有匹配上,则最小距离自增1,直到遍历完所有的场景。

最终的执行效果是有超时的用例。

然后思考了一下,通过一层nums遍历来完成,每个数值对应的镜像值是固定的,遍历到当前值是,找他它对应的镜像值,取最后一次出现的下标,计算出距离,以此遍历取过程中的最小值。

这儿遇到过一些问题,比如120的镜像值是21,但21的镜像值是12,两者不是一一对应的,而是多对一的。这个其实不是问题的重点,而是我忽略了一个条件,0 <= i < j < nums.length,并且 reverse(nums[i]) == nums[j]。numsj其实是个定值,如果从大方向往小方向进行遍历,这样只需要计算出当前值的镜像值,然后再判断镜像值是否在前面遍历的数据中出现过,出现了则取最后一次出现的下标,就能算出最小的距离,一直到遍历结束,求出最小的距离值即可。

3. 代码实现

java 复制代码
class Solution {
    public int minMirrorPairDistance(int[] nums) {
        int minDistance = Integer.MAX_VALUE;
        Map<Integer, Integer> lastIndexMap = new HashMap<>();
        int val, mirror;
        for (int i = nums.length - 1; i >= 0; i--) {
            val = nums[i];
            // 数值对应的镜像数值
            mirror = reverse(val);
            if (lastIndexMap.containsKey(mirror)) {
                minDistance = Math.min(minDistance, lastIndexMap.get(mirror) - i);
            }
            lastIndexMap.put(val, i);
        }
        return minDistance == Integer.MAX_VALUE ? -1 : minDistance;
    }

    public static int reverse(int num) {
        if (num < 10) {
            return num;
        }
        char[] charArray = String.valueOf(num).toCharArray();
        char[] reverseArray = new char[charArray.length];
        for (int i = 0; i < charArray.length; i++) {
            reverseArray[i] = charArray[charArray.length - i - 1];
        }
        return Integer.parseInt(new String(reverseArray));
    }
}

4. 总结

按照我过程中的理解,如果是一个或的关系,二者若a为b的镜像,或b为a的镜像,那么解题思路又不一样,要保存所有出现的可能逆镜像值的下标。再者,如果nums数组声明为一个环形数组,那么计算距离的方式又得变化一下。

相关推荐
CS创新实验室7 小时前
算法、齿轮与硅基大脑:数值计算发展简史
人工智能·算法·数值计算
海石9 小时前
1563分的简单题,可能就简单在能被暴力AC
算法·leetcode
海石9 小时前
1400分的dp汗流浃背之【交替子数组计数】
算法·leetcode
奋发向前wcx9 小时前
P2590 树的统计 题目解析
数据结构·算法·深度优先
imbackneverdie10 小时前
AI4S不止于分子药物:以MedPeer为代表的科研基建打开产业新增量
大数据·人工智能·算法·aigc·科研·学术·ai 4s
额鹅恶饿呃11 小时前
C语言中的数据结构和变量
c语言·数据结构·算法
运行时记录12 小时前
prompt-optimizer skill
算法
万法若空12 小时前
【数据结构-哈希表】哈希表原理
数据结构·算法·散列表
退休倒计时13 小时前
【每日一题】LeetCode 437. 路径总和 III TypeScript
算法·leetcode·typescript
学逆向的13 小时前
汇编——内存
开发语言·汇编·算法·网络安全