LeetCode笔记:原地修改数组
发布日期:2021-04-30 21:00:56
浏览次数:162
分类:精选文章
本文共 1910 字,大约阅读时间需要 6 分钟。
原地修改数组:解决多个问题的通用方法
在LeetCode学习过程中,遇到多个原地修改数组的问题,发现这些问题可以通过快慢指针技术高效解决。以下是针对三个常见问题的详细解答:
一、有序数组去重
问题描述: 给定一个排序数组,删除重复元素,返回新数组的长度。
解决思路: 使用快慢指针技术,快指针遍历数组,慢指针记录前一个未重复元素的位置。当快指针遇到新元素时,将其值赋给慢指针位置,并让慢指针前进。这样,数组的前面部分保留了所有唯一元素。
代码示例:
class Solution { public int removeDuplicates(int[] nums) { if (nums.length == 0) return 0; int fast = 0, slow = 0; while (fast < nums.length) { if (nums[fast] != nums[slow]) { nums[slow] = nums[fast]; slow++; } fast++; } return slow; }} 示例分析: 对于数组[1,1,2],处理后数组变为[1,2],返回长度2。该方法在O(N)时间复杂度内完成,且无额外空间。
二、移除特定值元素
问题描述: 给定数组和一个值,删除所有等于该值的元素,返回新数组长度。
解决思路: 使用同样的快慢指针方法。快指针遍历数组,当遇到要删除的值时,跳过;否则,将当前值赋给慢指针位置,慢指针前进。最终,慢指针位置即为新数组的长度。
代码示例:
class Solution { public int removeElement(int[] nums, int val) { if (nums.length == 0) return 0; int fast = 0, slow = 0; while (fast < nums.length) { if (nums[fast] != val) { nums[slow] = nums[fast]; slow++; } fast++; } return slow; }} 示例分析: 对于数组[3,2,2,3],删除3后,数组变为[2,2],返回长度2。该方法同样在O(N)时间内完成。
三、移动零
问题描述: 将数组中的所有零移到末尾,同时保持非零元素顺序。
解决思路: 首先使用removeElement函数去除所有零,记录其位置p。然后,从p到数组末尾,赋值为零。
代码示例:
class Solution { public void moveZeroes(int[] nums) { int p = removeElement(nums, 0); for (int i = p; i < nums.length; i++) { nums[i] = 0; } } private int removeElement(int[] nums, int val) { if (nums.length == 0) return 0; int fast = 0, slow = 0; while (fast < nums.length) { if (nums[fast] != val) { nums[slow] = nums[fast]; slow++; } fast++; } return slow; }} 示例分析: 对于数组[0,1,0,3,12],处理后变为[1,3,12,0,0],零移动到末尾。该方法通过两步操作高效完成。
总结
快慢指针技术在多个原地修改问题中表现出色,能够在O(N)时间复杂度内高效完成任务,且无需额外空间。通过灵活应用这一技术,可以解决多种数组操作问题,提升算法解决问题的效率。
发表评论
最新留言
哈哈,博客排版真的漂亮呢~
[***.90.31.176]2026年05月30日 01时24分01秒
关于作者
喝酒易醉,品茶养心,人生如梦,品茶悟道,何以解忧?唯有杜康!
-- 愿君每日到此一游!