肖-肖 发表于 2021-5-5 17:43:05

Java-之超详细删除排序数组中的重复项问题解决-双指针法

本帖最后由 肖-肖 于 2021-5-5 17:45 编辑

代码如下:
/**          删除排序数组中的重复项
*一个有序数组 nums,原地删除重复出现的元素,使每个元素只出现一次,返回删除后数组的新长度。
*注意点: 数组是有序的、是原地删除不能通过增加额外的空间来实现这个功能、
*不能使用额外的数组空间,必须再原地修改输入数组并在使用O(1)额外空间的条件下完成。
*例: 输入:
*    输出:5
*    重点考察:双指针算法
*/   
public class SortedArrayDuplicates {

        public static void main(String[] args) {
                // TODO Auto-generated method stub
                System.out.println(removeDuplicates(new int[]{0,1,2,2,3,3,4}));
               
        }
        //去除重复元素的方法 - 参数传入数组
        public static int removeDuplicates(int[] nums){
                //先对传进来的数组的长度进行校验
                if(nums.length == 0){
                        return 0;
                }
                //下面写双指针-分别为i(慢指针因为它从0开始)、j(快指针因为它从1开始)
                int i = 0;
                for(int j = 1;j<nums.length;j++){
                        //如果不相等的话就赋值
                        if(nums != nums){
                                i++;//nums != nums-》i指针往后走 其实判断完这个ifj也会++的,j始终最少要比i快1 也就是如果这两个值不相等的话i和j一起往后移
                                nums = nums;//把不相等的这个元素(快指针指向的元素)赋值给慢指针加1后指向的元素 这幸亏是有序的如果不是有序的那肯定不行啊
                        }
                        //如果这两个不相等就不会进入if内部
                        //如果相等的话也没必要i++因为相等不算是不一样的元素个数 就不管 i++快指针走就行
                       
                }
                return i+1;//i就是不重复数组的最后一个下标、长度的话需要加1
        }

}

运行结果
5
提示:
可以在代码的第27行打断点进行debug,更有助于理解
页: [1]
查看完整版本: Java-之超详细删除排序数组中的重复项问题解决-双指针法