鱼C论坛

 找回密码
 立即注册
查看: 2411|回复: 0

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

[复制链接]
发表于 2021-5-5 17:43:05 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能^_^

您需要 登录 才可以下载或查看,没有账号?立即注册

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

代码如下:
/**          删除排序数组中的重复项
 *一个有序数组 nums,原地删除重复出现的元素,使每个元素只出现一次,返回删除后数组的新长度。
 *注意点: 数组是有序的、是原地删除不能通过增加额外的空间来实现这个功能、
 *不能使用额外的数组空间,必须再原地修改输入数组并在使用O(1)额外空间的条件下完成。
 *例: 输入:[0,1,2,2,3,3,4]
 *    输出: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[j] != nums[i]){
                                i++;//nums[j] != nums[i]-》i指针往后走 其实判断完这个ifj也会++的,j始终最少要比i快1 也就是如果这两个值不相等的话i和j一起往后移
                                nums[i] = nums[j];//把不相等的这个元素(快指针指向的元素)赋值给慢指针加1后指向的元素 这幸亏是有序的如果不是有序的那肯定不行啊
                        }
                        //如果这两个不相等就不会进入if内部 
                        //如果相等的话也没必要i++因为相等不算是不一样的元素个数 就不管 i++快指针走就行
                        
                }
                return i+1;//i就是不重复数组的最后一个下标、长度的话需要加1
        }

}
运行结果
5
提示:
可以在代码的第27行打断点进行debug,更有助于理解
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号-1 | 粤公网安备 44051102000585号)

GMT+8, 2025-1-3 07:19

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表