2021-08-23leetcode刷题——26、删除有序数组中的重复项

【微信公众号:yi极】

删除有序数组中的重复项

题目描述:

给你一个有序数组 nums ,请你 原地 删除重复出现的元素,使每个元素 只出现一次 ,返回删除后数组的新长度。

不要使用额外的数组空间,你必须在 原地 修改输入数组 并在使用 O(1) 额外空间的条件下完成。

方法1:快慢指针

思路:fast代表快指针,找到与慢指针不同的元素就把值赋给慢指针所指向的元素,直到快指针遍历完所有的元素,此时慢指针所指向的slow-1前的元素都是包含所有元素且不重复的。

public class Solution2 {

    public static int removeDuplicates(int[] nums) {
        int fast = 0;
        int slow = 0;
        
        while(fast < nums.length ){
            nums[slow] = nums[fast];
            
            while(fast < nums.length && nums[slow] == nums[fast]){
                fast++;
            }
            
            slow++;
        }
        
        return slow;
    }
}

方法2:快慢指针(2)

public class Solution1 {
    
    public static int removeDuplicates(int[] nums) {
        
        int n = nums.length;
        
        if (n == 0) return 0;

        int fast = 1, slow = 1;
        
        while (fast < n) {
            if (nums[fast] != nums[fast - 1]) {
                nums[slow] = nums[fast];
                ++slow;
            }
            ++fast;
        }
        
        return slow;
    }
}

测试代码:

    public static void main(String[] args) {
        Scanner sc = new Scanner(System.in);
        
        System.out.printf("请输入有序数组长度:");
        int num = sc.nextInt();
        
        int [] nums = new int [num];
        System.out.print("请输入有序数组中的元素:");
        for(int i = 0;i < num;i++){
            nums[i] = sc.nextInt();
        }
        
        int len = removeDuplicates(nums);
        System.out.printf("数组长度为:%d\n",len);
        
        System.out.printf("数组元素为:");
        for(int i = 0;i < len;i++){
            System.out.printf("%d  ",nums[i]);
        }
    }

运行结果:
屏幕截图.png

你可能感兴趣的:(2021-08-23leetcode刷题——26、删除有序数组中的重复项)