Leetcode每日一题 —— 1855. 下标对中的最大距离

力扣 LeetCode 1855. 下标对中的最大距离 - 力扣(LeetCode) 1855. 下标对中的最大距离 - 给你两个 非递增 的整数数组 nums1 和 nums2 ,数组下标均 从 0 开始 计数。 下标对 (i, j) 中 0 <= i < nums1.length 且 0 <= ...
Leetcode每日一题 —— 1855. 下标对中的最大距离
Leetcode每日一题 —— 1855. 下标对中的最大距离
力扣 LeetCode

1855. 下标对中的最大距离 - 力扣(LeetCode)

1855. 下标对中的最大距离 - 给你两个 非递增 的整数数组 nums1 和 nums2 ,数组下标均 从 0 开始 计数。 下标对 (i, j) 中 0 <= i < nums1.length 且 0 <= j < nums2.length 。如果该下标对同时满足 i <= j 且 nums1[i] <= nums2[j] ,则称之为 有效 下标对,该下标对的 距离 为 j - i 。 返回所有 有效 下标对 (i, j) 中的 最大距离 。如果不存在有效下标对,返回 0...


思路

注意到两个序列都已经有序,这题可以考虑双指针或者二分查找做法。

咱觉得双指针的思路很自然,假设 i 指定 nums1 的元素,j 指定 nums2 的元素:

  • 如果 nums1[i] > nums2[j],则后移 i,直至 i 移动到尽头或者满足 nums1[i] <= nums2[j]
    (因为在 nums1[i] > nums2[j] 时,就算 j 更大,因为序列是非递增的,必然还是会有 nums1[i] > nums2[j]
  • 若满足第一条,就可以后移一次 j,更新结果。
    (因为距离是下标距离,我希望能在保持 nums1[i] <= nums2[j] 的同时 j-i 尽量大)

理清这两步后写起来就很容易了。


代码

class Solution {
public:
    int maxDistance(vector<int>& nums1, vector<int>& nums2) {
        // 注意 nums1 和 nums2 都是有序的
        // 因此这题能用上双指针
        // 注意距离是下标差,因此 nums1 中每个数 X 尽量要在 nums2 中找到最后一个 Y>=X
        int p1=0,p2=0;
        int n1=nums1.size(),n2=nums2.size();
        int res=0;
        while(p1<n1&&p2<n2){
            while(p1<n1&&nums2[p2]<nums1[p1]){
                // 不满足 nums2[j] >= nums1[i] 时前移 i
                p1++;
            }
            res=max(res,p2-p1);
            p2++;
        }
        return res;
    }
};

接着再复习一些题 (点击了解更多详细信息)

1 个帖子 - 1 位参与者

阅读完整话题

来源: linux.do查看原文