leetcode 3761. 镜像对之间最小绝对距离 中等

给你一个整数数组 nums

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

  • 0 <= i < j < nums.length,并且
  • reverse(nums[i]) == nums[j],其中 reverse(x) 表示将整数 x 的数字反转后形成的整数。反转后会忽略前导零,例如 reverse(120) = 21

返回任意镜像对的下标之间的 最小绝对距离 。下标 ij 之间的绝对距离为 abs(i - j)

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

示例 1:

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

输出: 1

解释:

镜像对为:

  • (0, 1),因为 reverse(nums[0]) = reverse(12) = 21 = nums[1],绝对距离为 abs(0 - 1) = 1
  • (2, 4),因为 reverse(nums[2]) = reverse(45) = 54 = nums[4],绝对距离为 abs(2 - 4) = 2

所有镜像对中的最小绝对距离是 1。

示例 2:

输入: nums = [120,21]

输出: 1

解释:

只有一个镜像对 (0, 1),因为 reverse(nums[0]) = reverse(120) = 21 = nums[1]

最小绝对距离是 1。

示例 3:

输入: nums = [21,120]

输出: -1

解释:

数组中不存在镜像对。

提示:

  • 1 <= nums.length <= 10^5
  • 1 <= nums[i] <= 10^9

分析:用一个哈希表记录出现过的数字,遍历 nums 数组,对每个数字进行镜像处理,检查镜像后的数字是否在哈希表中,若存在,则说明存在镜像对。统计镜像对数量即可。

cpp 复制代码
class Solution {
public:
    int minMirrorPairDistance(vector<int>& nums) {
        int n=nums.size(),cnt=1,ans=10000000;
        map<int,int>mp;
        vector<vector<int>>vec;vec.push_back(vector<int>());
        for(int i=0;i<n;++i)
        {
            if(mp[nums[i]]==0)mp[nums[i]]=cnt,cnt++,vec.push_back(vector<int>());
            vec[mp[nums[i]]].push_back(i);
        }
        for(int i=0;i<n;++i)
        {
            int val=0,temp=nums[i];
            while(temp)
                val=val*10+temp%10,temp/=10;

            // printf("i=%d val=%d num=%d\n",i,val,nums[i]);
            
            if(mp[val]==0)continue;

            int l=0,r=vec[mp[val]].size(),pos=-1;
            while(l<r)
            {
                int mid=(l+r)/2;
                if(vec[mp[val]][mid]>i)pos=mid,r=mid;
                else l=mid+1;
            }
            if(pos==-1)continue;

            pos=vec[mp[val]][pos];
            // printf("pos=%d ans=%d\n",pos,ans);

            ans=min(ans,pos-i);
        }
        if(ans==10000000)return -1;
        return ans;
    }
};
相关推荐
6Hzlia1 小时前
【Hot 100 刷题计划】 LeetCode 108. 将有序数组转换为二叉搜索树 | C++ 分治法详解
c++·算法·leetcode
菜鸟丁小真4 小时前
LeetCode hot100 -131.分割回文串
数据结构·算法·leetcode·知识点总结
Morwit5 小时前
【力扣hot100】 416. 分割等和子集
数据结构·c++·算法·leetcode·职场和发展
宵时待雨6 小时前
优选算法专题3:二分查找
数据结构·c++·算法·leetcode·职场和发展
@小柯555m6 小时前
算法(字母异位词分组)
java·开发语言·算法·leetcode
木子墨5166 小时前
LeetCode 热题 100 精讲 | 矩阵与图论进阶篇:矩阵置零 · 螺旋矩阵 · 旋转图像 · 搜索二维矩阵 II · 岛屿数量 · 腐烂的橘子
c++·算法·leetcode·矩阵·力扣·图论
米粒17 小时前
力扣算法刷题 Day 52
算法·leetcode·职场和发展
小雅痞7 小时前
[Java][Leetcode hard] 68. 文本左右对齐
java·开发语言·leetcode
6Hzlia7 小时前
【Hot 100 刷题计划】 LeetCode 102. 二叉树的层序遍历 | C++ 极简 DFS 巧解
c++·leetcode·深度优先