使用多指针模式计算数组中唯一值的算法,使用了两种方法,哪一种更好?
Algorithm to count unique values in the array using the Multiple-Pointers pattern, used two approaches, which one is better?
问题是实现一个名为 countUniqueValues
的函数,它接受一个排序数组,并对数组中的唯一值进行计数。数组中可以有负数,但总会排序。
我使用 多指针 模式来解决这个问题,因此它具有 O(n) 的时间复杂度和 O(1) 的 space 复杂度。我使用了两种不同的方法,一种使用 for
循环,另一种使用 while
循环。
这些方法中哪种更好?
方法一:使用 for 循环
function countUniqueValues(arr) {
if (arr.length === 0) return 0;
let pointer1 = 0;
for (let pointer2 = 1; pointer2 < arr.length; pointer2++) {
if (arr[pointer1] !== arr[pointer2]) {
pointer1++;
arr[pointer1] = arr[pointer2];
}
}
return pointer1 + 1;
}
方法 2:使用 while 循环
function countUniqueValues(arr) {
if (arr.length === 0) return 0;
let pointer1 = 0;
let pointer2 = pointer1 + 1;
while (pointer2 < arr.length) {
if (arr[pointer1] !== arr[pointer2]) {
pointer1++;
arr[pointer1] = arr[pointer2];
pointer2++;
} else if (arr[pointer1] === arr[pointer2]) {
pointer2++;
}
}
return arr.slice(0, pointer1 + 1).length;
}
预期时间复杂度:O(n)
预期 Space 复杂度:O(1)
使用 for
而不是 while
具有完全相同想法的循环是 而不是 不同的方法。
逻辑正确,但可以更简单。您想要在数组中找到元素不同(边界)的那些位置。现在你的最终答案是 <#border>+1
.
let border = 0;
for (let i = 1; i < arr.length; i++) {
if (arr[i - 1] != arr[i]) {
border++;
}
}
return border+1;
不需要改变数组,不需要保留两个指针
问题是实现一个名为 countUniqueValues
的函数,它接受一个排序数组,并对数组中的唯一值进行计数。数组中可以有负数,但总会排序。
我使用 多指针 模式来解决这个问题,因此它具有 O(n) 的时间复杂度和 O(1) 的 space 复杂度。我使用了两种不同的方法,一种使用 for
循环,另一种使用 while
循环。
这些方法中哪种更好?
方法一:使用 for 循环
function countUniqueValues(arr) {
if (arr.length === 0) return 0;
let pointer1 = 0;
for (let pointer2 = 1; pointer2 < arr.length; pointer2++) {
if (arr[pointer1] !== arr[pointer2]) {
pointer1++;
arr[pointer1] = arr[pointer2];
}
}
return pointer1 + 1;
}
方法 2:使用 while 循环
function countUniqueValues(arr) {
if (arr.length === 0) return 0;
let pointer1 = 0;
let pointer2 = pointer1 + 1;
while (pointer2 < arr.length) {
if (arr[pointer1] !== arr[pointer2]) {
pointer1++;
arr[pointer1] = arr[pointer2];
pointer2++;
} else if (arr[pointer1] === arr[pointer2]) {
pointer2++;
}
}
return arr.slice(0, pointer1 + 1).length;
}
预期时间复杂度:O(n)
预期 Space 复杂度:O(1)
使用 for
而不是 while
具有完全相同想法的循环是 而不是 不同的方法。
逻辑正确,但可以更简单。您想要在数组中找到元素不同(边界)的那些位置。现在你的最终答案是 <#border>+1
.
let border = 0;
for (let i = 1; i < arr.length; i++) {
if (arr[i - 1] != arr[i]) {
border++;
}
}
return border+1;
不需要改变数组,不需要保留两个指针