題目連結(jié):
題目意譯:
你被給定兩非遞增且索引值從 0 開始的整數(shù)陣列 nums1 和 nums2。
一對索引值 (i, j),其中 0 ≦ i < nums1.length 且 0 ≦ j < nums2.length,如果 i ≦ j 且 nums1[i] ≦ nums[j],則代表它們是合法的。而這對的距離值為 j - i。
回傳任一個合法對 (i, j) 中的最大距離值。如果沒有合法索引值對存在,則回傳 0。
一陣列 arr 為非遞增,代表著 arr[i - 1] ≧ arr[i] 對於每個索引值 i 滿足 1 ≦ i < arr.length。
限制:
1 ≦ nums1.length, nums2.length ≦ 10 ^ 5
1 ≦ nums1[i], nums2[j] ≦ 10 ^ 5
nums1 和 nums2 皆為非遞增的。
範(fàn)例測資:
範(fàn)例 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,4) 這對有著最大距離值為 2。
範(fàn)例 2:
輸入: nums1 = [2,2,2], nums2 = [10,10,1]
輸出: 1
解釋: 合法對為 (0,0) 、 (0,1) 和 (1,1)。
(0,1) 這對有著最大距離值為 1。
範(fàn)例 3:
輸入: nums1 = [30,29,19,5], nums2 = [25,25,25,25,25]
輸出: 2
解釋: 合法對為 (2,2) 、 (2,3) 、 (2,4) 、 (3,3) 和 (3,4)。
(2,4) 這對有著最大距離值為 2。
解題思維:
由於兩個陣列都是非遞增的,因此我們可以先將 nums1[i] 和 nums2[j](其中 i 和 j 一開始都是 0)配對在一起,然後重複以下步驟:
如果 nums1[i] > nums2[j],代表著 nums2[j] 、 nums2[j + 1] 、…… 都會小於 nums1[i]。因此我們再繼續(xù)從 nums2[j] 往後也不可能找到合法對。因此我們可以考慮 nums[i + 1],那此時需要重新考慮 nums[0] ~ nums[j - 1] 嗎?不需要,因為對於滿足 i ≦ j 的先前 j 值們,i + 1 離它們更近了。
而如果 nums1[i] ≦ nums2[j],代表著我們找到一個「幾乎」合法對(因為沒考慮 i ≦ j),所以我們可以計算其距離值 j - i(其實不需要考慮 i ≦ j,因為當(dāng) i > j,j - i < 0,所以不會影響最大值)。
當(dāng)我們掃完 nums1 或 nums2 後便可以結(jié)束以上過程,過程中所有的「幾乎」合法對中距離值最大的即為所求。
此次分享到此為止,如有任何更加簡潔的想法或是有說明不清楚之地方,也煩請各位大大撥冗討論。