今天要讲的算法题是LeetCode上的第26题,先贴题目:
首先题目中给出了几个比较关键的条件,首先就是升序排列的数组,这样的话至少我们不需要进行排序的操作,直接从前向后进行比较,我们就能知道数组中的哪些元素是相同的了,其次题目有一个要求是不要使用额外的空间,这个条件其实就限制了我们不能再去使用另外的数据结构了,只能使用当前这个数组,而不能说我再新建一个数组,把不相同的数字重新放到一个新数组中来得到我们的题解,这里其实就是一个隐含的条件,比如说数组长度是length,我们题解的未重复的数组长度是resultLength的话,那么resultLength - length这个部分其实就是我们放置那些重复元素的地方
题目中还有一个比较有迷惑性的要求,要我们原地删除重复出现的元素,其实这个操作并不是说要真的把数组中的元素删掉,只要我们把相同的数字放到我们上面提到的放置重复元素的地方即可
题目的要求大概就是这些,那么我们的思路应该从什么地方去切入呢?
既然是要移除相同的数字,那么肯定会有一个比较的过程,同时数组又是升序排列的,那么相同的数字肯定都是排列在一起的,只要我们用前后两个数字去进行比较的话,就能知道它们是不是相等了
这样的话,我们的解题思路就已经清晰了,我们需要有两个指针 i 和 j(j = i + 1),分别指向我们想要比较的数字进行比较,指针 j 不断向右移,遍历整个数组,保证我们能比较到所有的元素,指针 i 只有在和 j 数字不相等的情况下才会进行右移的操作,并且需要将指针 j 所在的元素给到我们的指针 i 所指的下一个元素,这样我们指针 i 所扫过的数字其实就是我们去重之后的题解,画个图来理解一下这个过程
代码如下
public int removeDuplicates(int[] nums) {
if (nums.length == 0 || nums == null)
return 0;
int i = 0,j = 1;
while (j < nums.length) {
if (nums[i] != nums[j]) {
nums[i + 1] = nums[j];
i++;
}
j++;
}
return i + 1;
}
通过代码我们可以发现其实实现起来并不复杂,主要是解决这道题的思路要正确,掌握了正确的解题方式就能事半功倍