繁体   English   中英

如何在不改变原始数组的情况下从时间复杂度为 O(n) 或更好的排序数组中获取唯一值

[英]How to get unique values from a sorted array with time complexity of O(n) or better without altering the original array

我想在不改变原始数组的情况下计算给定数组中的唯一值,但解决方案必须在time complexity of O(n) 到目前为止,我见过的所有解决方案的time complexity of O(n^2) ,就像这里一样。 我在解决方案的逻辑中找不到错误。 我是数据结构和算法的新手,想要一个简单的解决方案。

我的代码 -

const countUniqueValues = (arr) =>{
    if(arr.length === 0){
        return console.log(arr.length);
    }else if(arr.length === 1){
        return console.log(arr.length);
    }

    const unique = [];
    let i = 0;
    for( let j = 1; j < arr.length; j++){
        if(arr[i] !== arr[j]){
            i ++;
            unique.push(arr[i]);
        }
    }
    return console.log(unique);
}

//test cases
countUniqueValues([1,1,1,1,1,2]) // 2
countUniqueValues([1,2,3,4,4,4,7,7,12,12,13]) // 7
countUniqueValues([]) // 0
countUniqueValues([-2,-1,-1,0,1]) // 4

错误 Output -

[ 1 ]
[
  2, 3, 4,  4,
  4, 7, 7, 12
]
0
[ -1, -1, 0 ]

将数组转换为 Set ( O(n) ) 并计算集合的大小:

const countUniqueValues = arr => new Set(arr).size;

注意 - 非常重要 - 必须对 arrays 进行排序才能使其正常工作:

这应该可以解决问题:

 var prevValue = "";

const countUniqueValues = (arr) =>{
    if(arr.length === 0){
        return console.log(arr.length);
    }else if(arr.length === 1){
        return console.log(arr.length);
    }
    
    prevValue = arr[0];

    let i = 1;
    for( let j = 1; j < arr.length; ++j){
        if(arr[j] != prevValue){
            ++i;
            prevValue = arr[j];
        }
    }
    console.log(i);
   return i;
}
const makeUniqueAndCount = arr => {
  const uniqueKeysObject = {};

  arr.forEach(number => {
    uniqueKeysObject[number] = true;
  });

  return Object.keys(uniqueKeysObject).length;
};

此解决方案使用 javascript 中的对象。 javascript object 的密钥始终是唯一的。 然后您可以使用 javascript object 原型的 keys 方法将其转换为数组以获取其长度。 此解决方案也适用于未排序的数组。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM