文章目录
- 题目
- 审题
- 思路
- 实现
- 实现一
- 实现二
- 结果
题目
给你一个有序数组 nums ,请你 原地 删除重复出现的元素,使每个元素 只出现一次 ,返回删除后数组的新长度。
不要使用额外的数组空间,你必须在 原地 修改输入数组 并在使用 O(1) 额外空间的条件下完成。
审题
这道题的重点有两个:
1、nums 是一个有序数组。
基于第一点,我们可以明白,一个指针从数组一侧移动到另一侧,一旦指针所指向的元素的值和上一个指针指向的元素的值不相等,那么该指针后面的所有元素都不会与该指针前面的元素相等,因为该数组是一个有序
数组。
2、不能使用额外的内存空间,原地删除元素。
基于第二点,我们明白我们不能真正的删除元素,或者将元素移动到其他数组中,这也就意味着,我们只能在原数组中进行元素的移动,所以题目中的原地删除,本质上就是对数组元素的移动,从而达到一种“伪删除”的目的。
思路
1、在数组上设置两个指针,指针 i
初始指向 0
位索引,指针 j
初始指向 1
位索引。
2、我们向后移动 j
指针,如果 j
指向的元素不等于 i
指向的元素,我们就将 j
指针指向的元素复制到 i + 1
的索引位置上去。
3、向后移动 j
指针,直到 j
指针指向数组最后一位元素。
4、返回 i
指针指向的元素的索引 + 1,即为不重复元素的长度。
实现
实现一
复制代码
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19class Solution { public int removeDuplicates(int[] nums) { int i = 0, j = 1; while (j < nums.length) { if (nums[i] != nums[j]) { swap(nums, ++i, j); } j++; } return i + 1; } public void swap(int[] nums, int i, int j) { int temp = nums[i]; nums[i] = nums[j]; nums[j] = temp; } }
实现二
复制代码
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18class Solution { public int removeDuplicates(int[] nums) { int i = 0; for (int j = 1; j < nums.length; j++) { if (nums[i] != nums[j]) { swap(nums, ++i, j); } } return i + 1; } public void swap(int[] nums, int i, int j) { int temp = nums[i]; nums[i] = nums[j]; nums[j] = temp; } }
结果
解答成功:
执行耗时:1 ms,击败了82.38% 的Java用户
内存消耗:39.9 MB,击败了95.36% 的Java用户
最后
以上就是慈祥钢笔最近收集整理的关于LeetCode:删除有序数组中的重复项的全部内容,更多相关LeetCode:删除有序数组中内容请搜索靠谱客的其他文章。
本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
发表评论 取消回复