力扣1855题解析:双指针算法求解数组最大距离的优化解法
一、题目解读
力扣1855题要求计算两个整数数组nums1和nums2的最大距离,即找到两数组中元素索引差的绝对值最大值。需考虑数组长度差异及空数组边界情况,核心在于高效遍历与距离计算。
二、解题思路
采用双指针算法,通过动态移动两个指针i和j分别遍历nums1和nums2。核心逻辑:当nums1[i] ≤ nums2[j]时,计算当前距离并尝试扩大j以寻找更远距离;若不满足条件则移动i。通过确保i ≤ j的约束,避免无效比较,优化时间复杂度至O(n+m)。
三、解题步骤
1. 初始化:定义max_dist记录最大距离,获取数组长度m和n,指针i、j初始化为0。
2. 边界处理:若任一数组为空,直接返回0。
3. 双指针循环:
若i ≤ j:
若nums1[i] ≤ nums2[j],更新max_dist为当前j - i与旧值的最大值,并右移j探索更大差值;
否则左移i,确保当前i满足条件。
若i > j,直接右移j维持约束。
4. 返回值:循环结束后,max_dist即为所求最大距离。
四、代码与注释
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) { // 确保i不落后于j if (nums1[i] <= nums2[j]) { max_dist = max(max_dist, j - i); // 更新最大距离 j++; // 尝试更大的j } else { i++; // 当前i不满足条件,移动i } } else { j++; // 调整j追上i } } return max_dist; // 返回最终结果 } };
五、总结
本解法通过双指针的动态移动,巧妙将问题转化为“实时比较与距离更新”,避免了暴力枚举的O(n²)复杂度。关键在于维持i ≤ j的约束,确保每次比较均基于有效位置差。代码简洁高效,兼顾边界处理与性能优化,为同类数组距离问题提供了可复用的算法模板。
原创内容 转载请注明出处