LeetCode系列之 (JavaScript) => 26. 删除有序数组中的重复项

题目描述:

LeetCode系列之 (JavaScript) =>  26. 删除有序数组中的重复项LeetCode系列之 (JavaScript) =>  26. 删除有序数组中的重复项

【self】: 题干的内容是在一个有序的数组内,去除重复元素 ; 要求改变的原有数组,并且返回不重复元素的个数

解题思路分析:

    这个题目最好的解决思路是用快慢指针,但是需要考虑这两个指针分别代表的含义;
    判断当前数和它的后一个数是否相等,相等就后移一个数,并且接着判断后移的数和它后边的数是否相等,然后一直循环下去。不相等就将后一个数保存起来,并且长度加 1,然后结束循环。
    

不同解法:

/**
 * @param {number[]} nums
 * @return {number}
 */

//self:
//解题思路:
//  投机取巧,想要用Map类型,使用Map自带的方法和属性,以此来判断重复的元素
//  map的key记录的是不重复的元素,value 记录的是索引号,如果现有map里不存在该元素,添加到map
var removeDuplicates = function(nums) {
    var map = new Map();
    var j = 0;
    for(var i = 0; len = nums.length, i<len; i++){
        if(!map.has(nums[i])){
            map.set(nums[i],i)
            nums[j] = nums[i];
            j++;
        }
        
    }
    return map.size;
};

//解题思路: 
// wang's solution  https://leetcode.wang/leetCode-26-Remove-Duplicates-from-Sorted-Array.html
// 一开始看不懂得写写画画,后来理解了,这样的写法比普通的减少了循环次数

var removeDuplicates = function(nums) {
    var len = 1;
    for (var i = 0; i < nums.length - 1; i++) {
        while (i < nums.length - 1) {
            if (nums[i] == nums[i + 1]) {
                i++;
                console.log(i)
            } else {
                nums[len] = nums[i + 1];
                len = len + 1;
                console.log('break'+ i)            
                break;
            }
        }
    }
    return len;
}

// 大牛 solution
//解题思路:
//  使用快慢指针。慢指针循环整个数组,快指针用来表示不重复的元素的索引
var removeDuplicates = function(nums) {
    var fast = 1, slow = 0;
    var len = nums.length;
    while(fast < len){
        if(nums[fast] != nums[slow]){
            slow++;
            nums[slow] = nums[fast];
        }else{
            fast++;
        }
    }
    // for(fast; fast<len; fast++){
    //     if(nums[fast] != nums[slow]){
    //         slow++;
    //         nums[slow] = nums[fast];
    //     }
    // }
    return slow+1; // slow 记录的是索引号,但要求返回长度,所以加1
}

参考链接:

上一篇:leetcode 最长回文子串


下一篇:LeetCode剑指offer刷题day01