leecode初级算法:(1)删除排序数组中的重复项

题目描述:

        给定一个排序数组,你需要在原地删除重复出现的元素,使得每个元素只出现一次,返回移除后数组的新长度。不要

使用额外的数组空间,你必须在原地修改输入数组并在使用 O(1) 额外空间的条件 下完成。

 


 

解决思路:

  我这里有两种方法,一种是官方的正宗的双指针法,另一种是临时变量法。

(1)双指针法:

       使用两个指针从相同方向访问提供的排序数组,其中一个指针(假设为i)从数组的 头访问到数组的尾,另一个指针(假

设为j)则是从数组的第一位开始访问,两者相互之间做比较,若 遇到num[j] ≠ num[i],则将num[j]的值赋给num[i+1],然后

递增i,接着重复相同的过程,直到j到达 数组的末尾为止。相等则j++继续判断。这里我使用的是C#语言来实现算法的。

代码如下图所示:

public class Solution {
    public int RemoveDuplicates(int[] nums) {
        
        //双指针法
        if(nums == null || nums.Length == 0)
            return 0;
        else
        {
            int i = 0;
            for(int j =1; j<nums.Length;j++)
            {
                if(nums[j] != nums[i])
                    i++;
                    nums[i]=nums[j];          
            }
            return i+1;
        }
  }
}

(2)临时变量法:

       可以声明一个tempbia变量,在刚开始时将num[0]赋值给temp变量,然后还得int 一个长度变量len,其是用来存储删

除重复项后的数组长度的。通过循环遍历,判断,若temp=num[i],则continue即jixu继续循环,反之则重新给temp变量

赋值,num[len]=temp;len++;重复这个过程直到数组的末尾为止。

代码如下图所示:

public class Solution {
    public int RemoveDuplicates(int[] nums) {
        
        //利用临时变量实现
       if(nums == null || nums.Length == 0)
           return 0;
        else if(nums.Length == 1)
            return 1;
        else
        {
            int temp = nums[0];  //temp用来比较的临时变量
            int len = 1;    //替换
            
            for(int i = 1; i<nums.Length;i++)  //循环遍历 
            {
                if(temp == nums[i])  //相同则继续找下一个
                    continue;
                else
                {  
                    temp = nums[i];
                    nums[len] = temp;
                    len++;
                }
            }
        return len;
      }
    
}

注意要点:

在利用算法实现时,均需要判断数组是否为空!

版权声明:本文为博主原创文章,转载请注明,谢谢。https://mp.csdn.net/postedit/82180517

猜你喜欢

转载自blog.csdn.net/dd_jkgh/article/details/82180517