LeetCode第26题思悟——删除排序数组中的重复项(remove-duplicates-from-sorted-array)
知识点预告
- 双指针遍历数组的技巧;
题目要求
给定一个排序数组,你需要在原地删除重复出现的元素,使得每个元素只出现一次,返回移除后数组的新长度。
不要使用额外的数组空间,你必须在原地修改输入数组并在使用 O(1) 额外空间的条件下完成。
来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/remove-duplicates-from-sorted-array
著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。
示例
示例 1:
给定数组 nums = [1,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。
你不需要考虑数组中超出新长度后面的元素。
来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/remove-duplicates-from-sorted-array
著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。
我的思路
双指针同时遍历数组,前面指针扫描数据,后面指针表示下一个非重复数据的位置,也就是数组的长度;
public int removeDuplicates(int[] nums) {
int currentNum;
int nextIndex=0;
int length=nums.length;
for(int i=0;i<length;i++){
currentNum=nums[i];
nums[nextIndex]=currentNum;
nextIndex++;
while(i<length&&nums[i]==currentNum){
i++;
}
i--;
}
return nextIndex;
}
优秀解法
//解法A
public int removeDuplicates(int[] nums) {
if(nums.length<2) return nums.length;
int tempi = 0;
for(int i=1;i<nums.length;i++){
if(nums[i]!=nums[tempi]){
tempi++;
nums[tempi]=nums[i];
}
}
return tempi+1;
}
差异分析
解法A和自己的解法基本一致,只是对重复数字的检测方法不一样;解法A是在一次for循环中完成填充和检测,动作统一;而我的解法则将检测放在了while循环里;
知识点小结
- 双指针遍历数组的技巧;