赞
踩
今天的题目是力扣面试经典150题中的数组的中等难度题: 删除有序数组中的重复项 II
给定一个排序好的数组 nums,请原地删除重复出现的元素,使得每个元素最多出现两次,并返回删除后数组的新长度。不要使用额外的数组空间,你必须在原地修改输入数组并在使用 O(1) 额外空间的条件下完成。
题目要求我们删除一个已排序数组中的重复元素,使得每个元素最多出现两次。我们需要在原地修改数组,并且只能使用常数级别的额外空间。
重点注意的地方是已排序的数组,因为已排序的数组,有需要原数组操作比较,我们可以优先考虑一下双指针法进行求解。在移出重复元素的简单难度中也分析过。只不过我们需要考虑得到是之前移出到只有一个元素,现在保留两个,那么我们指针的间距和起始位置也要修改。
直接考虑双指针法,需要注意的就是两个指针的作用及起始位置。
双指针法:
最后输出慢指针的值,就是结果数组的长度。
下面是通过以上分析使用双指针法的 Java 实现:
public class RemoveDuplicatesII { public static void main(String[] args) { RemoveDuplicatesII solution = new RemoveDuplicatesII(); // 示例数据 int[] nums = {1, 1, 1, 2, 2, 3}; // 调用删除重复项的方法 int newLength = solution.removeDuplicatesFastSlow(nums); // 输出结果 System.out.println("New length : " + newLength); } /** * 删除有序数组中的重复项 II:双指针法(快慢指针) * * @param nums 排序好的数组 * @return 删除重复项后的数组新长度 */ public int removeDuplicatesFastSlow(int[] nums) { if (nums.length <= 2) { return nums.length; } int slow = 2; for (int fast = 2; fast < nums.length; fast++) { if (nums[fast] != nums[slow - 2]) { nums[slow] = nums[fast]; slow++; } } return slow; } }
执行函数,测试通过:
提交到力扣,测试也通过:
在对有序数组的问题解决中,双指针法是非常实用的。目前为止已经用了好几次了。所以熟练掌握双指针法,对于数组方面的算法问题的解决会有很大帮助。
中等难度第一题,搞定!!!
感觉还行,加油!!!
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。