当前位置:首页 > 力扣题解 > 力扣1855题详解:双指针法解两个数组的最大距离问题

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

11小时前力扣题解26

截图未命名.jpg 力扣1855题详解:双指针法解两个数组的最大距离问题 力扣题解 双指针算法 数组 C++ 第1张

一、问题描述

给定两个非递增排序数组nums1和nums2,我们需要找到满足nums1[i] <= nums2[j]的(i,j)对中,j-i的最大值。如果不存在这样的对,则返回0。

二、解题思路

这道题可以采用双指针法高效解决:

  1. 利用两个指针i和j分别遍历两个数组

  2. 始终保持i <= j的约束条件

  3. 当nums1[i] <= nums2[j]时,计算当前距离并尝试更大的j

  4. 否则移动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;
    }
};

四、关键点解析

  1. 双指针初始化:i和j都从0开始,分别指向两个数组的起始位置

  2. 边界条件处理:首先检查空数组的特殊情况

  3. 核心逻辑

    • 当nums1[i] <= nums2[j]时,计算当前距离并尝试更大的j

    • 否则移动i指针寻找更小的nums1[i]

  4. 指针移动规则:始终保持i <= j的约束条件

五、总结

通过这道题,我们学习了:

  1. 如何利用双指针处理两个有序数组的问题

  2. 指针移动条件的设置技巧

  3. 边界条件的处理方法

  4. 时间复杂度优化思路


原创内容 转载请注明出处

分享给朋友:

发表评论

访客

看不清,换一张

◎欢迎参与讨论,请在这里发表您的看法和观点。