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;
    }
};
相关推荐
Tisfy3 小时前
LeetCode 1927.求和游戏:抵消+看最值
java·leetcode·游戏·题解·博弈论
玖玥拾3 小时前
LeetCode 125 验证回文串
算法·leetcode
玖玥拾12 小时前
LeetCode 392 判断子序列
笔记·算法·leetcode
重生之后端学习14 小时前
239. 滑动窗口最大值[困难]✅
java·数据结构·算法·leetcode·职场和发展
INGNIGHT1 天前
1584.连接所有点的最小费用(最小生成树&并查集union find)
c++·leetcode
wabs6661 天前
关于二叉树【力扣144.二叉树的前序遍历的思考】
数据结构·c++·算法·leetcode·二叉树
Xin7702 天前
LeetCode 23.合并 K 个升序链表(分治递归)
leetcode
Nil2082 天前
leetcode 105从前序和中序遍历序列构造二叉树
算法·leetcode·职场和发展
Nil2082 天前
leetcode 114二叉树展开为链表
leetcode·链表·深度优先
cz07102 天前
hot100_搜索二维矩阵 II
算法·leetcode