1068 字
5 分钟
力扣每日一题(镜像对之间最小绝对距离)

力扣每日一题(镜像对之间最小绝对距离)#

镜像对之间最小绝对距离(枚举右,维护左)#

还是惯例,开头放链接

题目#

这里简单翻译一下题目大意,有一个整数数组,需要找不同角标下的两个元素,第一个的反转等于第二个的值,要求两个角标的绝对距离,

补充:反转#

就是高位变低位,低位变高位

坑点1.关于这里的两个数,并不能换位置,因为前数的变换并非可逆变换

坑点2.刚才说的并非可逆变换指的是会如果120倒过来就会变成21,而21倒回去就不能变成120了

我们从题目中可知,由于需要反转,所以i和j不能互换,又需要去找相同(等于)的值,所以自然想到了用哈希表去进行匹配

想法:

  1. 哈希表的key存一下值,然后value存角标,到时候看一下有哪些key里面角标对比了距离小就是了
  2. 正的存一次反的看一次,对比那个小用哪个

3.基于2次顺序输入

到此,我写出了第一版代码:

初版(并不完美)#

class Solution {
public:
int minMirrorPairDistance(vector<int>& nums) {
unordered_map<int, vector<int>> mp; //这里放一个哈希表,用来存相同数值下的角标
for(int i=1;i<nums.size();i++) {
mp[nums[i]].push_back(i); //先把j放进去
}
int min = INT_MAX/2;
for (int i=0;i<nums.size()-1;i++) {
int temp = reverse(nums[i]); //再去找反转的i
if (mp.contains(temp)) {
for (auto j:mp[temp]) {
if (i<j&&j-i<min) { //匹配以后因为题中i<j,所以去做了个匹配
min = j-i;
if (min==1)return 1; //这里还笨拙的做了一个优化,即已经找到最优解了就不用往下找了
}
}
}
}
if (min == INT_MAX/2) return -1;
return min;
}
int reverse(int x) { //反转的代码,非常朴实无华
int rev = 0;
while (x != 0) {
rev = rev * 10 + (x % 10);
x /= 10;
}
return rev;
}
};

发现问题#

到现在,读者是否会发现一些问题🤔:

  1. 全程需要遍历两次(多一点)的原始数组
  2. 需要把整个数据装进来才找得到
  3. 把每一个出现过的都装进哈希表

所以作者就去看了一下题解👀,然后以下是一些心得

正片开始#

我们的题目叫做枚举右维护左(其实是茶佬起的题目)

关注茶佬喵,关注茶佬谢谢喵茶佬B站链接

实际的全名应该叫做向右👉枚举数组,维护左侧🫲哈希表

为什么这么说呢,我们直接上代码

class Solution {
public:
int minMirrorPairDistance(vector<int>& nums) {
unordered_map<int, int> last_index; //同样创建一个哈希表,但是不需要是数组了,目的只保留当前最靠右侧的反转值
int n = nums.size(), ans = n;
for (int j = 0; j < n; j++) { //向右枚举数组里的值
int x = nums[j];
auto it = last_index.find(x); //去找一下哈希表里面是否存在相同值
if (it != last_index.end()) {
ans = min(ans, j - it->second); //有就看一下是否需要更新最小值
}
// 计算 reverse(x),不用字符串
int rev = 0;
for (; x > 0; x /= 10) {
rev = rev * 10 + x % 10;
}
last_index[rev] = j; //然后强制替换当前哈希表对应值保留的角标,因为如果之前有更小的就已经记录了ans
}
return ans < n ? ans : -1; //返回
}
};
//作者:灵茶山艾府
//链接:https://leetcode.cn/problems/minimum-absolute-distance-between-mirror-pairs/solutions/3845358/mei-ju-you-wei-hu-zuo-pythonjavacgo-by-e-wlzl/
//来源:力扣(LeetCode)
//著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。

一些心得#

我们可以看出,茶佬的代码这边是开表存角标的思路在之前是对上了,但是存在几个优化的点

  1. 对于处理i,j的关系,选择让用过的j去成为i,然后通过hash匹配的机制,可以让当前j快速找到过往的i实现计算
  2. 只保留了最新的数值对应的i,因为是边录入边算,符合条件了就算,所以到时候覆盖的时候已经不用担心之前的值还需要使用了
力扣每日一题(镜像对之间最小绝对距离)
https://blog.yuanguo.online/posts/力扣每日一题镜像对之间最小绝对距离/
作者
yuanguolalala
发布于
2026-04-17
许可协议
CC BY-NC-SA 4.0
封面
示例歌曲
示例艺术家
封面
示例歌曲
示例艺术家
0:00 / 0:00