使用多指针模式计算数组中唯一值的算法,使用了两种方法,哪一种更好?

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;

不需要改变数组,不需要保留两个指针