合并两个排序数组(leetcode 88):我不明白它怎么不会越界
Merge two sorted arrays (leetcode 88): i cant understand how it wont go out of bounds
我使用两个指针遇到的解决方案:
var merge = function (nums1, m, nums2, n) {
let idx1 = m - 1,
idx2 = n - 1,
idx3 = m + n - 1;
while (idx2 >= 0) {
nums1[idx3--] = nums1[idx1] > nums2[idx2] ? nums1[idx1--] : nums2[idx2--];
}
};
该解决方案有效,但我无法理解,
考虑 nums1 = [7,9,11,0,0,0,0], nums2 = [1,2,12,14]
,
在算法中的某个点,nums1 的索引为 7,nums2 为 2,
下一次迭代会导致idx1也为-1,那以后的比较语句会怎样?
(我希望我能把问题说清楚,如果我需要用更好的语言表达请告诉我)
此代码可以在 2 个地方越界,但它工作正常,因为 Javascript 在涉及越界数组访问时有点奇怪:
- 它可以在
nums1
结束后写入新元素。 Javascript 将自动加长数组以容纳新值。
- 可以比较
nums1[-1] > nums2[idx2]
。 nums1[-1]
是undefined
,所以这个比较永远是false
,这正是作者想要的。
如果你曾经写过这样的代码,你应该添加注释来解释它为什么有效,因为它依赖于 Javascript 的特性,这些特性不会转移到其他语言中,并且对阅读的每个人来说都不是显而易见的代码。
我使用两个指针遇到的解决方案:
var merge = function (nums1, m, nums2, n) {
let idx1 = m - 1,
idx2 = n - 1,
idx3 = m + n - 1;
while (idx2 >= 0) {
nums1[idx3--] = nums1[idx1] > nums2[idx2] ? nums1[idx1--] : nums2[idx2--];
}
};
该解决方案有效,但我无法理解,
考虑 nums1 = [7,9,11,0,0,0,0], nums2 = [1,2,12,14]
,
在算法中的某个点,nums1 的索引为 7,nums2 为 2,
下一次迭代会导致idx1也为-1,那以后的比较语句会怎样?
(我希望我能把问题说清楚,如果我需要用更好的语言表达请告诉我)
此代码可以在 2 个地方越界,但它工作正常,因为 Javascript 在涉及越界数组访问时有点奇怪:
- 它可以在
nums1
结束后写入新元素。 Javascript 将自动加长数组以容纳新值。 - 可以比较
nums1[-1] > nums2[idx2]
。nums1[-1]
是undefined
,所以这个比较永远是false
,这正是作者想要的。
如果你曾经写过这样的代码,你应该添加注释来解释它为什么有效,因为它依赖于 Javascript 的特性,这些特性不会转移到其他语言中,并且对阅读的每个人来说都不是显而易见的代码。