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

标题: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]+"  ");
		}
	}
}

猜你喜欢

转载自blog.csdn.net/weixin_45986454/article/details/107459815