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;
    }
};
相关推荐
mmmmath_35 小时前
LeetCode.541.反转字符串II
数据结构·算法·leetcode
Navigator_Z5 小时前
LeetCode //MySQL - 1251. Average Selling Price
c语言·算法·leetcode
参.商.7 小时前
【Day 53】76. 最小覆盖子串
leetcode·golang
虚无的纽扣9 小时前
【力扣刷题】第二天:无重复字符的最长字串、移动零问题
算法·leetcode·排序算法
圣保罗的大教堂13 小时前
leetcode 3742. 网格中得分最大的路径 中等
leetcode
我不会起名字32214 小时前
一天一道算法题(35):电话号码的字母组合
java·数据结构·后端·python·leetcode·go·回溯
圣保罗的大教堂15 小时前
leetcode 2033. 获取单值网格的最小操作数 中等
leetcode
6Hzlia15 小时前
【Classic 150 刷题计划】 LeetCode 242. 有效的字母异位词 | C++ 哈希计数与严密防线
c++·算法·leetcode
wabs66615 小时前
关于二叉树【力扣101.对称二叉树的思考】
数据结构·c++·算法·leetcode·二叉树
6Hzlia16 小时前
【Classic 150 刷题计划】 LeetCode 228. 汇总区间 | C++ 双游标区间扫描与 to_string 规范
c++·算法·leetcode