实现效果
方法一:
不改变原数组,定义一个新数组来放不重复的数字,采用双层循环的方法,内层循环判断重复值的个数。
时间复杂度:O(n*n)
空间复杂度:O(n)
function unique(arr){
var res = [];
for(var i = 0; i < arr.length; i++){
for(var j = i+1; j < arr.length; j++){
if(arr[i] === arr[j]){
j = ++i; //都向后移,跳过重复数字
}
}
res.push(arr[i]);
}
return res;
}
方法二:
利用
splice
直接在原数组上进行操作,比方法一节省空间。
时间复杂度:O(n*n)
空间复杂度:O(1)
function unique_one(arr){
for(var i = 0; i < arr.length; i++){
for(var j = i+1; j < arr.length; j++){
if(arr[i] === arr[j]){
//遇到相同的,使用splice删除
arr.splice(j,1);
j--;
}
}
}
}
补充知识:
splice() 方法可以向/从数组中添加/删除项目,然后返回被删除的项目,该方法会改变原始数组。
arrayObject.splice(index,howmany,item1,.....,itemX)
方法三:
ES6 提供了新的数据结构 Set,它类似于数组,但是成员的值都是唯一的,没有重复的值。超级好用!此处用到了对象中的拓展运算符(...),用于取出参数对象中的所有可遍历属性,拷贝到当前对象之中。
const items = [...new Set(arr)];//传入需要操作的数组
console.log(items);
补充:
若数组已经排好序,则可以使用双指针法,时间复杂度O(n),空间复杂度O(1)。
步骤:
1.定义指针 i=0 , j =1,遍历数组;
2.若nums[i] == nums[j],删除nums[j] , j--;
3.若num[i] != nums[i] , i++;
代码:
var removeDuplicates = function(nums) {
let i = 0;
for(let j = 1; j < nums.length; j++){
if(nums[i] == nums[j]){
//遇到相同的,使用splice删除
nums.splice(j,1);
j--;
}else {
i++;
}
}
return nums;
};