力扣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的约束条件
五、总结
通过这道题,我们学习了:
原创内容 转载请注明出处