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

84 阅读2分钟

1.题目链接

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

2.原题描述:

给你一个 升序排列 的数组 nums ,请你 原地 删除重复出现的元素,使每个元素 只出现一次 ,返回删除后数组的新长度。元素的 相对顺序 应该保持 一致 。然后返回 nums 中唯一元素的个数。

考虑 nums 的唯一元素的数量为 k ,你需要做以下事情确保你的题解可以被通过:

更改数组 nums ,使 nums 的前 k 个元素包含唯一元素,并按照它们最初在 nums 中出现的顺序排列。nums 的其余元素与 nums 的大小不重要。 返回 k 。

3.相关算法

本题考察数组相关的操作,涉及到的算法主要是双指针的使用,当然也可以使用双循环来暴力求解【时间复杂度O(n^2),空间复杂度O(1)】,本文使用双指针的解法【时间复杂度O(n),空间复杂度O(1)】

4.本题主要思路

本题采用双指针可以使用一个for循环来完成暴力双循环的解题,使用p指针来当目标指针,q指针当快指针,当nums[p]!=nums[q]时,将nums[q]赋值给nums[p+1],这样可以保证每个数值在数组中只有一个,赋值完以后p++,往前移动,等到q遍历完整个数组时返回p+1的到结果。

5.源码分析

class Solution {
    public int removeDuplicates(int[] nums) {
        if(nums == null || nums.length == 0) 	// 1
            return 0;
        int p = 0;								// 2
        int q = 1;
        while(q < nums.length){					// 3
            if(nums[p] != nums[q]){				// 4
                nums[p + 1] = nums[q];  		
                p++;  							// 5
            }
            q++;								// 6
        }
        return p + 1;							// 7
    }
}
  1. 空值判断,若当前数组为空,或者长度为零则直接返回结果;(数组为空与数组长度为0并非相同,数组为空可能是没有分配内存空间为初始化,数组长度为0则已分配了内存空间只是暂时为放相应元素);
  2. 初始化双指针;
  3. 进行循环遍历,通过q指针来判断是否遍历完整个数组;
  4. 当p和q位置对应的值不相等是则将q对应的值覆盖p+1位置的值(不能覆盖p位置的值,应为并不知道p是第几个相同的数);
  5. 赋值完后p的位置往前一步进行迭代;
  6. 若p和q的位置不相等,则q++进行迭代;
  7. 返回不重复元素的个数(p的值是数值下标的值,题目要求的是返回元素的个数,所以要进行+1返回)。