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

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

2个月前 (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题要求解决一个基于图连通性的操作优化问题。给定一个无向图,包含边权重,以及一系列查询,每个查询询问两点间路径的最小操作次数。题目关键在于高效计算路径上权重分布的统计信息,并转化...

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

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

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

力扣面试题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]...

力扣1643题:第K小字典序路径(附C++代码与解题思路)

力扣1643题:第K小字典序路径(附C++代码与解题思路)

一、题目解读本题要求生成从原点(0, 0)到目标坐标(destination[0], destination[1])的路径中,字典序第K小的路径。路径仅由向下字符'V'(代表垂直移动)...

发表评论

访客

看不清,换一张

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