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;
    }
};
相关推荐
8Qi81 天前
LeetCode 75:颜色分类(荷兰国旗问题)—— Java 题解 ✅
java·算法·leetcode·指针·排序
(●—●)橘子……1 天前
力扣第503场周赛练习理解
python·学习·算法·leetcode·职场和发展·周赛
风筝在晴天搁浅2 天前
快手 CodeTop LeetCode 224.基本计算器
数据结构·算法·leetcode
8Qi82 天前
LeetCode 31:下一个排列(Next Permutation)—— 完整题解笔记 ✅
笔记·算法·leetcode·指针·思维·排列
玖釉-2 天前
编辑距离(Edit Distance)——从字符串相似度到动态规划经典模型
算法·leetcode·动态规划
_日拱一卒2 天前
LeetCode:46全排列
算法·leetcode·职场和发展
剑挑星河月2 天前
31.下一个排列
java·算法·leetcode
凌波粒2 天前
LeetCode--98.验证二叉搜索树(二叉树)
算法·leetcode·职场和发展
Misnearch2 天前
3635. 最早完成陆地和水上游乐设施的时间II
leetcode·贪心·排序
WWW65262 天前
代码随想录 打卡第四十七天
数据结构·算法·leetcode