Leetcode 26/80:删除有序数组的重复项—java代码

26.删除有序数组的重复项

题目详情:
给定一个有序数组nums,请 原地 删除重复出现的元素,使每个元素只出现一次,返回删除后数组的新长度。不使用额外的数组空间,必须在 原地 修改输入数组,并在使用 O(1) 额外空间的条件下完成。

示例1:

输入: nums = [1,1,2]
输出: 2,nums = [1,2]
解释: 函数返回新的长度 2 ,并且原数组 nums 的前两个元素被修改为 1, 2 。不需要考虑数组中超出新长度后面的元素。

示例2:

输入: nums = [0,0,1,1,1,2,2,3,3,4]
输出: 5, nums = [0,1,2,3,4]
解释: 函数返回新的长度 5 , 并且原数组 nums 的前五个元素被修改为 0, 1, 2, 3, 4 。不需要考虑数组中超出新长度后面的元素。

方法一: 双指针(快慢指针)

  1. 给定的数组为有序数组,表明所有重复的元素必定相邻;
  2. 要求删除所有重复项,其实只是为了将所有不重复的元素移到数组的左侧。
  3. 左侧指针为慢指针记为slow,右侧指针为快指针记为fast
  4. 算法流程:
    循环以下1)、2):while (fast < nums.length)
    1). 如果 slow == fast,则fast+1,即. fast后移一位
    2). 如果slow != fast,则fast位置上的元素赋值给slow+1位置上,并且slow和fast均后移一位;
    3). return slow+1;
class Solution {
	public int removeDuplicates(int[] nums) {
	    if(nums == null || nums.length == 0) return 0;//判断数组中是否为空
	    int slow = 0;//初试化慢指针
	    int fast = 1;//初试化快指针
	    while(fast < nums.length){//循环条件:只要快指针地址不超过数组长度,则一直循环
	        if(nums[slow] != nums[fast]){//判断不等的情况
	            nums[slow + 1] = nums[fast];
	            slow++;
	        }
	        fast++;//执行相等的情况
	    }
	    return slow + 1;//最后返回的是数组的元素个数,而slow是下标,所以返回需要+1
	}
}

方法二: 通用解法
题目要求使每个元素只出现一次,通用解法改为每个元素出现k次

步骤:
  1. 由于保留k个相同的元素,对于前k个元素,可以直接进行保留
  2. 对于后面任意的元素,能够保留的前提是:与当前写入位置的第k个元素进行比较,不相同则保留。
class Solution {
   public int removeDuplicates(int[] nums) {   
       return process(nums, k);
   }
   int process(int[] nums, int k) {
       int u = 0; 
       for (int x : nums) {
           if (u < k || nums[u - k] != x) nums[u++] = x;
       }
       return u;
   }
}
  1. 于是,此题每个元素只出现1次,把return中的k改成1即可。
class Solution {
    public int removeDuplicates(int[] nums) {   
        return process(nums, 1);
    }
    int process(int[] nums, int k) {
        int u = 0; 
        for (int x : nums) {
            if (u < k || nums[u - k] != x) nums[u++] = x;
        }
        return u;
    }
}

80.删除有序数组的重复项Ⅱ

示例1:

输入: nums = [1,1,1,2,2,3]
输出: 5, nums = [1,1,2,2,3]
解释: 函数返回新长度 length = 5,并且原数组的前五个元素被修改为 1, 1, 2, 2, 3 。

示例2:

输入: nums = [0,0,1,1,1,2,2,3,3,4]
输出: 5, nums = [0,1,2,3,4]
解释: 函数返回新的长度 5,并且原数组 nums 的前五个元素被修改为 0, 1, 2, 3, 4 。

因为每个元素保留2个相同元素,只要把k设为2即可。

class Solution {
    public int removeDuplicates(int[] nums) {   
        return process(nums, 2);
    }
    int process(int[] nums, int k) {
        int u = 0; 
        for (int x : nums) {
            if (u < k || nums[u - k] != x) nums[u++] = x;
        }
        return u;
    }
}

注释:写的不好之处请您纠正,新手小白,期待您来指教!!!

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值