1068 字
5 分钟
力扣每日一题(镜像对之间最小绝对距离)
力扣每日一题(镜像对之间最小绝对距离)
镜像对之间最小绝对距离(枚举右,维护左)
还是惯例,开头放链接
题目
这里简单翻译一下题目大意,有一个整数数组,需要找不同角标下的两个元素,第一个的反转等于第二个的值,要求两个角标的绝对距离,
补充:反转
就是高位变低位,低位变高位
坑点1.关于这里的两个数,并不能换位置,因为前数的变换并非可逆变换
坑点2.刚才说的并非可逆变换指的是会如果120倒过来就会变成21,而21倒回去就不能变成120了
我们从题目中可知,由于需要反转,所以i和j不能互换,又需要去找相同(等于)的值,所以自然想到了用哈希表去进行匹配
想法:
- 哈希表的key存一下值,然后value存角标,到时候看一下有哪些key里面角标对比了距离小就是了
- 正的存一次反的看一次,对比那个小用哪个
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; }};发现问题
到现在,读者是否会发现一些问题🤔:
- 全程需要遍历两次(多一点)的原始数组
- 需要把整个数据装进来才找得到
- 把每一个出现过的都装进哈希表
所以作者就去看了一下题解👀,然后以下是一些心得
正片开始
我们的题目叫做枚举右维护左(其实是茶佬起的题目)
关注茶佬喵,关注茶佬谢谢喵茶佬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)//著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。一些心得
我们可以看出,茶佬的代码这边是开表存角标的思路在之前是对上了,但是存在几个优化的点
- 对于处理i,j的关系,选择让用过的j去成为i,然后通过hash匹配的机制,可以让当前j快速找到过往的i实现计算
- 只保留了最新的数值对应的i,因为是边录入边算,符合条件了就算,所以到时候覆盖的时候已经不用担心之前的值还需要使用了
力扣每日一题(镜像对之间最小绝对距离)
https://blog.yuanguo.online/posts/力扣每日一题镜像对之间最小绝对距离/