26. 删除排序数组中的重复项

#26. 删除排序数组中的重复项

题目描述
26. 删除排序数组中的重复项_第1张图片
解题思路
这道题真实暴露水平系列,我看着感觉很简单,但是东写西写了很久也没完全对,自己都看不下去自己写的代码,然后花了好久好不容易过了,一看题解双指针简洁优雅简单,我人都傻了。
1、双指针解法
瞧瞧这简洁的代码,我硬背都要背下来!

public static int removeDuplicates(int[] nums) {
	if(nums.length == 0)
   		return 0;
  	int p = 0;   //p慢指针
  	for (int q = 1; q < nums.length; q++) {  //q快指针
 	 //如果p和q相等,那么q直接后移一位;如果不相等,p后移一位,把q位置上的复制到p上
   		if(nums[p] != nums[q]) {
   			 p++;
    			nums[p] = nums[q];
   		}
   	}
  	return p+1;
}

再放个图片加深理解:
26. 删除排序数组中的重复项_第2张图片

2、我自己的乱七八糟解法
这估计明天我就不记得自己为啥这么写了,还是记录一下。大概想的就是找到后面一个不重复的数字,然后替换。希望能好好学习,以后少写这种憨批代码,丢人

在这里插入代码片
public static int removeDuplicates(int[] nums) {
	int n = nums.length;
  	if(n == 0)
   		return 0;
  	int temp = nums[0],max = nums[n-1];
  	if (temp == max) {
   		return 1;
  	}
  	for (int i = 1; i < nums.length; i++) {
   		int j = i;
		if (nums[i] <= temp && temp != max) {  
    		//当后面的数字小于temp(最前一个不重复的数字),就要往后找下一个不重复的
    		while (nums[j]  <= temp && j < nums.length - 1) 
     			j++;
		nums[i] = nums[j];
    		temp = nums[j];
    		n = i+1;
   	}
   	else 
    	temp = nums[i];
   	if (temp == max) {
    		return i+1;
   		}
  	}
  	return n;
}
  

你可能感兴趣的:(力扣刷题笔记)