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

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

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


原创内容 转载请注明出处

分享给朋友:

相关文章

牛客3750题解题报告:滑动窗口最大值的高效解法(C++代码详解)

牛客3750题解题报告:滑动窗口最大值的高效解法(C++代码详解)

一、题目解读牛客3750题要求在一个给定的整数数组中,计算指定窗口大小下的滑动窗口最大值。例如,输入数组num=[1,3,-1,-3,5,3,6,7],窗口大小为size=3时,需输出每个窗口内的最大...

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

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

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

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

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

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

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

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

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

LeetCode 2466题解:统计构造好字符串的方案数(动态规划+模运算)

LeetCode 2466题解:统计构造好字符串的方案数(动态规划+模运算)

一、题目解读LeetCode 2466题要求统计在长度范围 [low, high] 内,由字符 '0' 和 '1' 构成的“好字符串”数量。好字符串定义为:每次可添加...

LeetCode 2576题解:双指针法求解最多标记下标(排序+贪心策略)

LeetCode 2576题解:双指针法求解最多标记下标(排序+贪心策略)

一、题目解读LeetCode 2576题要求在一个整数数组中寻找最多可标记的下标对:若 nums[i] * 2 <= nums[j](i ≠ j),则下标 i 和 j 可配对标记。例如,输入 [...

发表评论

访客

看不清,换一张

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