算法初探LeetCode-下标对中的最大距离

67 阅读2分钟

开启掘金成长之旅!这是我参与「掘金日新计划 · 12 月更文挑战」的第28天,点击查看活动详情

LeetCode1855:下标对中的最大距离

给你两个 非递增 的整数数组 nums1​​​​​​ 和 nums2​​​​​​ ,数组下标均 从 0 开始 计数。

下标对 (i, j) 中 0 <= i < nums1.length 且 0 <= j < nums2.length 。如果该下标对同时满足 i <= j 且 nums1[i] <= nums2[j] ,则称之为 有效 下标对,该下标对的 距离 为 j - i​​ 。​​

返回所有 有效 下标对 (i, j) 中的 最大距离 。如果不存在有效下标对,返回 0 。

一个数组 arr ,如果每个 1 <= i < arr.length 均有 arr[i-1] >= arr[i] 成立,那么该数组是一个 非递增 数组。

示例 1:

输入:nums1 = [55,30,5,4,2], nums2 = [100,20,10,10,5]
输出:2
解释:有效下标对是 (0,0), (2,2), (2,3), (2,4), (3,3), (3,4) 和 (4,4) 。
最大距离是 2 ,对应下标对 (2,4) 。

示例 2:

输入:nums1 = [2,2,2], nums2 = [10,10,1]
输出:1
解释:有效下标对是 (0,0), (0,1) 和 (1,1) 。
最大距离是 1 ,对应下标对 (0,1) 。

示例 3:

输入:nums1 = [30,29,19,5], nums2 = [25,25,25,25,25]
输出:2
解释:有效下标对是 (2,2), (2,3), (2,4), (3,3) 和 (3,4) 。
最大距离是 2 ,对应下标对 (2,4) 。

 

提示:

  • 1<=nums1.length<=1051 <= nums1.length <= 10^5
  • 1<=nums2.length<=1051 <= nums2.length <= 10^5
  • 1<=nums1[i],nums2[j]<=1051 <= nums1[i], nums2[j] <= 10^5
  • nums1nums2都是非递增数组nums1 和 nums2 都是 非递增 数组

思路分析

由题目示例分析出相对应处理方法,遍历nums1每一位与nums2的对应位进行比较,遍历长度更短, 例如i为0时,nums1显示的是下标为0的第一位,分别与nums2的每位比较,当比到nums1大于nums2的之时,后续将不再进行比较,直接让nums1的第二位即下标为1的数字跟nums2的第二位及之后的每一位进行比较

算法代码

public int maxDistance(int[] nums1, int[] nums2) {
   int i=0,j=0,maxDistance=0;
   while(i<nums1.length){
       if(j>nums2.length-1 || nums1[i]>nums2[j]){
           i++;
           j=i+maxDistance;
       }else{
           if(maxDistance<(j-i)){
               maxDistance=j-i;    
           }
           j++;
       }
   }
    return maxDistance;
}

结果详情

Snipaste_2022-12-26_22-26-08.png

算法复杂度

  • 空间复杂度:O(1)O(1)
  • 时间复杂度:O(n)O(n)

掘金(JUEJIN)一起进步,一起成长!