【leetcode】每日精选题详解之26. 删除排序数组中的重复项(经典题)

        嗨,大家好,我是袁小厨(因为酷爱做饭,所以自己考取了厨师证)。之前一直看大家写的博客,学到了很多东西。然后最近萌生了自己写的想法,将自己知道的分享给需要的同学。以后每天会为大家分享leetcode精选题目的各种题解和Python, JS, JQ, CSS, PHP, JAVA的一些小Demo。请大家关注我,一起交流学习吧。


26. 删除排序数组中的重复项【经典】

题目描述

在这里插入图片描述


快慢指针

做题思路

快慢指针顾名思义就是一个指针在前面走(快),另一个在后面走(慢),然后当前面的指针和后面的指针的值相同时,那前面的走,后面的不动,当不同时共同往前走。

初始状态

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
此时红指针和绿指针的值一样,需要注意,此时只移动红,而蓝不动
在这里插入图片描述
然后将红色的值赋给绿的下一个节点
在这里插入图片描述
这里需要注意的是我们 nums[++i]==nums[j++] 这个代码是核心,赋值时应先将i加1,不然会把i的当前值覆盖掉。
在这里插入图片描述
跳出循环

题目代码

class Solution {
    
    
    public int removeDuplicates(int[] nums) {
    
    
       if(nums.length == 0){
    
    
            return 0;
       }           
       int i = 0;
       int j = 1;
       while(j<nums.length){
    
    
           if(nums[i]!=nums[j]){
    
     
                //这一行代码很重要
               nums[++i]=nums[j++];          
           }else{
    
    
                j++;
           }
       }
       //输出的是长度,需要注意
       return i+1;
    }
}

时间复杂度:O(n),空间复杂度:O(1)
        


压缩法

做题思路

压缩法就是将数组的长度缩小,每遇到相同的数字就进行压缩数组,然后快指针向前移动,快指针是每遍历一次移动一次,这个方法和快慢指针方法类似。

题目代码

class Solution {
    
    
    public int removeDuplicates(int[] nums) {
    
    
        int length=nums.length;
        int j=1;
        //遍历数组
        for(int i=0;i<nums.length-1;i++)
        {
    
       //如果相同的话就压缩数组
        	if(nums[i]==nums[i+1]) 
               length--;           
            else
               //不同情况进行移动
               nums[j++]=nums[i+1]; 

        }
        return length;
    }
}

        


总结

这个题目属于数组的经典题,推荐大家做一做,学会了快慢指针的思想对很多题目都有帮助。           

        

作者:LeetCode
链接:https://leetcode-cn.com/problems/rotate-array/solution/xuan-zhuan-shu-zu-by-leetcode/
来源:力扣(LeetCode)
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。

猜你喜欢

转载自blog.csdn.net/tan45du_yuan/article/details/108912535