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

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

1天前

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


原创内容 转载请注明出处

分享给朋友:

相关文章

汉诺塔问题递归解法(C++代码详解) 牛客4414题解题指南

汉诺塔问题递归解法(C++代码详解) 牛客4414题解题指南

一、题目解读汉诺塔问题是一个经典的递归算法题目:有n个大小不同的圆盘按从大到小顺序放在柱A上,需借助柱B,将圆盘移至柱C,每次只能移动一个圆盘,且大圆盘不能置于小圆盘之上。牛客4414题要求编写函数输...

【力扣3115题解】数组中质数最大差值的求解(C++代码详解)

【力扣3115题解】数组中质数最大差值的求解(C++代码详解)

一、题目解读力扣3115题要求在一个整数数组中,找出两个质数之间的最大差值。若数组不存在质数,则返回0。题目核心在于高效筛选质数,并计算其索引差值的最大值,需兼顾时间与空间复杂度。二、解题思路参考代码...

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

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

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

【1999NOIP普及组】(洛谷P1016)旅行家的预算解题报告(附代码+注释)

【1999NOIP普及组】(洛谷P1016)旅行家的预算解题报告(附代码+注释)

一、题目解读题目要求解决旅行家从起点到终点(D1公里)的预算问题,需在沿途N个加油站中规划加油策略,使总费用最小化。每个加油站有不同油价和距离,汽车每升油可行驶D2公里,初始油量为C升,终点无加油站。...

【牛客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。题目难点在...

发表评论

访客

看不清,换一张

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