力扣1855题详解:双指针法解两个数组的最大距离问题

一、问题描述
给定两个非递增排序的数组nums1和nums2,我们需要找到满足nums1[i] <= nums2[j]的(i,j)对中,j-i的最大值。如果不存在这样的对,则返回0。
二、解题思路
这道题可以采用双指针法高效解决:
利用两个指针i和j分别遍历两个数组
始终保持i <= j的约束条件
当nums1[i] <= nums2[j]时,计算当前距离并尝试更大的j
否则移动i指针寻找更小的nums1[i]
三、完整代码解析
class Solution {
public:
int maxDistance(vector<int>& nums1, vector<int>& nums2) {
int max_dist = 0;
int m = nums1.size(), n = nums2.size();
int i = 0, j = 0;
// 处理空数组的特殊情况
if (m == 0 || n == 0) return 0;
while (i < m && j < n) {
if (i <= j) {
if (nums1[i] <= nums2[j]) {
max_dist = max(max_dist, j - i);
j++; // 尝试更大的j
} else {
i++; // 当前i不满足条件
}
} else {
j++; // 确保i <= j
}
}
return max_dist;
}
};四、关键点解析
双指针初始化:i和j都从0开始,分别指向两个数组的起始位置
边界条件处理:首先检查空数组的特殊情况
核心逻辑:
当nums1[i] <= nums2[j]时,计算当前距离并尝试更大的j
否则移动i指针寻找更小的nums1[i]
指针移动规则:始终保持i <= j的约束条件
五、总结
通过这道题,我们学习了:
原创内容 转载请注明出处
