您的位置:首页 > 其它

LeetCode - 从排序数组中删除重复项

2018-03-05 11:49 507 查看
题目描述:

https://leetcodechina.com/explore/suan-fa/card/chu-ji-suan-fa/1/di-yi-zhang-jie/21/

给定一个有序数组,你需要原地删除其中的重复内容,使每个元素只出现一次,并返回新的长度。

不要另外定义一个数组,您必须通过用 O(1) 额外内存原地修改输入的数组来做到这一点。

给定数组: nums = [1,1,2],

你的函数应该返回新长度 2, 并且原数组nums的前两个元素必须是1和2
不需要理会新的数组长度后面的元素


解题思路:

参考资料:http://www.cnblogs.com/grandyang/p/4329128.html

可以使用快慢指针,当数字相同时快指针后移,当数字不同时先移动慢指针再赋值。

那么这道题的解题思路是,我们使用快慢指针来记录遍历的坐标,最开始时两个指针都指向第一个数字,如果两个指针指的数字相同,则快指针向前走一步,如果不同,则两个指针都向前走一步,这样当快指针走完整个数组后,慢指针当前的坐标加1就是数组中不同数字的个数

最终代码:

public class RemoveDuplicates {
@Test
public void test1() {
Assert.assertEquals(1, removeDuplicates1(new int[]{1, 1, 1}));
Assert.assertEquals(0, removeDuplicates1(new int[]{}));
Assert.assertEquals(1, removeDuplicates1(new int[]{1}));
Assert.assertEquals(2, removeDuplicates1(new int[]{1, 1, 2}));
Assert.assertEquals(3, removeDuplicates1(new int[]{1, 1, 2, 2, 2, 3, 3}));
Assert.assertEquals(4, removeDuplicates1(new int[]{1, 2, 3, 4, 4, 4, 4}));
Assert.assertEquals(5, removeDuplicates1(new int[]{1, 2, 3, 4, 5}));
}

// 快慢指针
public int removeDuplicates1(int[] nums) {

if (nums == null || nums.length == 0) {
return 0;
}

int i = 0;
int j = 0;

for (; i < nums.length; i++) {
if (nums[j] != nums[i]) {
nums[++j] = nums[i];
}
}
return j+1;
}
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: