标题:java定一个排序数组,你需要在 原地 删除重复出现的元素,使得每个元素只出现一次,返回移除后数组的新长度。
一、题目:
给定一个排序数组,你需要在 原地 删除重复出现的元素,使得每个元素只出现一次,返回移除后数组的新长度。
不要使用额外的数组空间,你必须在 原地 修改输入数组 并在使用 O(1) 额外空间的条件下完成。
链接:添加链接描述
二、题解
方式一:复杂度为n^2
public int deleteRepeatNum(int[] nums) {
int i=1;
int j=nums.length-1;
while(i<j) {
if(nums[i]==nums[i-1]) {
for(int t=i;t<j;t++) {
nums[t]=nums[t+1];
}
nums[j]=nums[i];
j--;
}else{
i++;
}
}
if(nums.length>1) {
if(nums[i]==nums[i-1]) {
return i;
}
}
return j+1;
}
方法二、复杂度为n, 相等就移动快指针j,不相等就移动慢指针i,并赋值给nums[i]=nums[j]
public int deleteRepeatNum02(int[] nums) {
int i=0;
for(int j=i+1;j<nums.length;j++) {
if(nums[i]!=nums[j]) {
i++;
nums[i]=nums[j];
}
}
return i+1;
}
完整代码如下:
public class TestDeleteRepeatNum {
/**
* 复杂度为n^2
* @param nums
* @return
*/
public int deleteRepeatNum(int[] nums) {
int i=1;
int j=nums.length-1;
while(i<j) {
if(nums[i]==nums[i-1]) {
for(int t=i;t<j;t++) {
nums[t]=nums[t+1];
}
nums[j]=nums[i];
j--;
}else{
i++;
}
}
if(nums.length>1) {
if(nums[i]==nums[i-1]) {
return i;
}
}
return j+1;
}
@Test
public void test() {
// int[] nums=new int[] {0,0,1,1,1,2,2,3,3,6};
// int[] nums=new int[] {0,0,1,5,8,8,16,28};
// int[] nums=new int[] {1,1,1,1,1};
int[] nums=new int[] {
0,0,1,1,1,1,1};
int len = this.deleteRepeatNum(nums);
for(int i=0;i<len;i++) {
System.out.print(nums[i]+" ");
}
}
/**
* 复杂度为n, 相等就移动快指针j,不相等就移动慢指针i,并赋值给nums[i]=nums[j]
* @param nums
* @return
*/
public int deleteRepeatNum02(int[] nums) {
int i=0;
for(int j=i+1;j<nums.length;j++) {
if(nums[i]!=nums[j]) {
i++;
nums[i]=nums[j];
}
}
return i+1;
}
@Test
public void test02() {
// int[] nums=new int[] {0,0,1,1,1,2,2,3,3,6};
// int[] nums=new int[] {0,0,1,5,8,8,16,28};
// int[] nums=new int[] {1,1,1,1,1};
int[] nums=new int[] {
0,0,1,1,1,1,1};
int len = this.deleteRepeatNum02(nums);
for(int i=0;i<len;i++) {
System.out.print(nums[i]+" ");
}
}
}