当前位置:   article > 正文

Leetcode 26/80:删除有序数组的重复项—java代码_每个元素均出现k次的话,除了一个元素例外

每个元素均出现k次的话,除了一个元素例外

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
	}
}
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15

方法二: 通用解法
题目要求使每个元素只出现一次,通用解法改为每个元素出现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
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  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;
    }
}
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12

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;
    }
}
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12

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

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/article/detail/50653
推荐阅读
相关标签
  

闽ICP备14008679号