下标对中的最大距离
双指针-最大窗口
-
解题思路:
- num1 和 num2 设置两个指针 L 和 R;当 nums1[L] > nums2[R]时,L++;当 nums1[L] < nums2[R]时,R++,一直移动到不满足条件或者移动到结尾;
- 这时返回 R-1-L 就是最大窗口的大小;
-
复杂度:
- 时间复杂度:O(n1+n2);
- 空间复杂度:O(1);
-
代码实现:
var maxDistance = function (nums1, nums2) { let len1 = nums1.length; let len2 = nums2.length; let L = 0; let R = 0; while (L < len1 && R < len2) { if (nums1[L] > nums2[R]) { L++; } R++; } return R - L - 1 >= 0 ? R - L - 1 : 0; };
二分
-
解题思路:
- 第一层循环确定一个数 n;
- 第二层二分查找,找到大于等于 n 的最后一个数 m;
- 然后返回 left-1-i 的最大值;
-
复杂度:
- 时间复杂度:O(n1logn2);
- 空间复杂度:O(1);
-
代码实现:
var maxDistance = function (nums1, nums2) { let len1 = nums1.length; let len2 = nums2.length; let res = 0; for (let i = 0; i < len1; i++) { // 此处查找的范围在 [i,len2-1] let left = i; let right = len2 - 1; while (left <= right) { let mid = left + (right - left) >> 1; if (nums1[i] <= nums2[mid]) { left = mid + 1; } else { right = mid - 1; } } res = Math.max(res, left - 1 - i); } return res; };
打赏作者
您的打赏是我前进的动力
微信
支付宝
303.区域和检索-数组不可变
上一篇
评论