题目描述:
给定一个排序数组,你需要在原地删除重复出现的元素,使得每个元素只出现一次,返回移除后数组的新长度。不要
使用额外的数组空间,你必须在原地修改输入数组并在使用 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.youkuaiyun.com/postedit/82180517