当前位置:首页 > 力扣 > 力扣1855题解析:双指针算法求解数组最大距离的优化解法

力扣1855题解析:双指针算法求解数组最大距离的优化解法

6个月前 (07-24)

力扣1855题解析:双指针算法求解数组最大距离的优化解法 力扣题解 双指针 C++代码 第1张

一、题目解读

力扣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的约束,确保每次比较均基于有效位置差。代码简洁高效,兼顾边界处理与性能优化,为同类数组距离问题提供了可复用的算法模板。


原创内容 转载请注明出处

分享给朋友:

相关文章

【力扣2846题】图论+二进制提升:高效解决连通性问题(附C++代码)

【力扣2846题】图论+二进制提升:高效解决连通性问题(附C++代码)

一、题目解读力扣2846题要求解决一个基于图连通性的操作优化问题。给定一个无向图,包含边权重,以及一系列查询,每个查询询问两点间路径的最小操作次数。题目关键在于高效计算路径上权重分布的统计信息,并转化...

【牛客157题】:反转链表指定区间(虚拟头节点解法)

【牛客157题】:反转链表指定区间(虚拟头节点解法)

一、题目解读牛客第157题要求反转链表中第m到n个节点(包含m和n)的区间,并保持其他节点顺序不变。例如,给定链表1→2→3→4→5,m=2,n=4,应返回1→4→3→2→5。题目重点在于处理边界条件...

力扣面试题02.05链表相加:虚拟头节点+迭代解法的详细解析

力扣面试题02.05链表相加:虚拟头节点+迭代解法的详细解析

一、题目解读力扣面试题02.05要求将两个链表表示的整数相加,每个节点存储一位数字(逆序),结果同样以链表形式返回。例如,链表1为7→2→4,链表2为5→6→3,相加结果应为2→9→8→7。题目难点在...

LeetCode 2523题解:寻找区间内最小间隔质数对(C++代码)

LeetCode 2523题解:寻找区间内最小间隔质数对(C++代码)

一、题目解读LeetCode 2523题要求在一个给定的整数区间 [left, right] 内,找到间隔最小的两个质数(即相邻质数的差值最小),并返回这对质数。若区间内不存在两个质数,则返回 [-1...

力扣LCR074题区间合并算法解析:贪心排序与区间重叠处理

力扣LCR074题区间合并算法解析:贪心排序与区间重叠处理

一、题目解读力扣LCR074题要求对给定的二维区间数组(每个区间由起始点和终止点构成)进行合并,将重叠的区间合并为更宽的区间,最终输出不重叠的合并结果。例如,输入[[1,3],[2,6],[8,10]...

LeetCode 1031题解析:不重叠子数组最大和的解法(前缀和+动态规划)

LeetCode 1031题解析:不重叠子数组最大和的解法(前缀和+动态规划)

一、题目解读LeetCode 1031题要求在不重叠的前提下,从给定数组nums中寻找两个长度分别为firstLen和secondLen的连续子数组,使其和最大。题目强调子数组必须不重叠,即两个子数组...

发表评论

访客

看不清,换一张

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