删除有序数组中的重复项
给你一个有序数组 原地删除重复出现的元素 让每个元素只能出现一次 返回删除后数组的新长度 不能用额外的数组空间 必须要在原地修改输入数组并在使用O(1)额外空间的条件下完成
package LeeCodeTest26;
题解就是使用双指针 一个快指针和一个慢指针 快指针移动的找到不同的数字 然后将找到的数字复制给慢指针所指向的索引 也就是重新在原来的基础上将老数组重新刷新了以便
/**
* 给你一个有序数组nums 请你原地删除重复出现的元素
* 使每个元素只出现一个 返回删除后数组的新长度。
* 不要使用额外的数组空间 你必须要在原地修改输入数组并在使用O(1)额外空间的条件下完成
*
* 删除一个有序数组删除掉数组中间重复的元素 他这个是删除数组过会 返回的是一个修改输入数组的新长度
* 并且还会返回一个修改过会的修改数组就是已经经过去重过后的
*/
/**
* 解题思路
* 从第一个开始进行寻找 依次和数组里面的进行比对将相同的数字进行一个记录 并且删除
* 或者我们可以将这个数组中的数据存到hashmap中应为hashmap 是不允许重复的数字的
* 使用双指针法 来操作一下数组
*/
public class LeeCodeTest26 {
public int removeDuplicates(int[] nums){
//删除有序数组中的重复项
//使用双指针法
if(nums.length==0)
return 0;
//定义一个慢指针 一个快指针
int slowIndex=1;
int fastIndex=1;
while(fastIndex<nums.length){
if(nums[fastIndex]!=nums[fastIndex-1]){
nums[slowIndex]=nums[fastIndex];
++slowIndex;
}
++fastIndex;
}
//这里为什么要加1就是我们的慢指针是从0开始的 而我们的的长度是我们数组的索引+1所形成的
return slowIndex;
}
public static void main(String[] args) {
LeeCodeTest26 test= new LeeCodeTest26();
int[] array={1,1,2};
int i = test.removeDuplicates(array);
System.out.println(i);
}
}