数组增删改查及双指针法

张开发
2026/4/15 1:19:11 15 分钟阅读

分享文章

数组增删改查及双指针法
刷题日记LeetCode 27 移除元素 —— 双指针法真的太香了今天死磕了 LeetCode 第 27 题「移除元素」从一开始的暴力暴力到最后秒懂双指针法真的有一种“打通任督二脉”的感觉把这一题的学习心得写成一篇博客记录一下我的成长过程。 题目初印象题目要求很简单给定一个数组 nums 和一个值 val 原地移除所有等于 val 的元素返回新数组的长度。关键要求不能用额外数组空间复杂度必须是 O(1)。刚开始看题的时候我第一反应是这还不简单直接遍历一遍遇到等于 val 的元素就删掉不就行了然后我就写了第一版代码——暴力解法。 方法一暴力解法练手专用暴力解法的思路最直观也最符合新手的直觉1. 遍历数组找到所有等于 val 的元素2. 找到后把后面的所有元素整体前移一位覆盖掉要删除的元素3. 数组有效长度减 1而且下标要回退不然会漏检。代码写出来是这样的Javajavaclass Solution {public int removeElement(int[] nums, int val) {int validLen nums.length;for (int i 0; i validLen; i) {if (nums[i] val) {// 后面元素整体前移for (int j i 1; j validLen; j) {nums[j - 1] nums[j];}validLen--;i--; // 关键防止漏检}}return validLen;}}优点逻辑好懂适合练手缺点时间复杂度 O(n²)数据大了之后会很慢。写完这版我终于明白暴力能过但不是最优解。 方法二双指针法本题精髓看了题解和视频讲解才知道这题的核心是 双指针法这里用的是快慢双指针两个指针分工明确- 慢指针 slow指向新数组下一个要存放的位置- 快指针 fast遍历原数组找不等于 val 的元素。只要快指针找到有效元素不等于 val 就把它赋值给慢指针指向的位置然后慢指针前进。遍历结束后慢指针的数值就是新数组的长度。代码超简洁javaclass Solution {public int removeElement(int[] nums, int val) {int slow 0;for (int fast 0; fast nums.length; fast) {if (nums[fast] ! val) {nums[slow] nums[fast];slow;}}return slow;}}时间复杂度 O(n)空间复杂度 O(1)完美符合题目要求。写完这版我直接感叹双指针法也太优雅了吧 复杂度对比解法 时间复杂度 空间复杂度 优点 缺点暴力解法 O(n²) O(1) 逻辑直观练手专用 效率低大数据易超时双指针法 O(n) O(1) 高效简洁面试必问 需要理解指针逻辑 学习总结1. 数组的“删除”本质是覆盖因为数组内存连续无法直接删除只能前移覆盖2. 双指针法是数组操作的核心神器把时间复杂度从 O(n²) 降到 O(n)效率直接翻倍3. 做题一定要追求最优解暴力能过只是开始掌握双指针才是真正学会数组操作。今天这一题让我彻底明白了快慢双指针的逻辑也为后面刷数组、链表的题目打下了坚实的基础。接下来继续冲 后续练习推荐掌握这题后可以趁热打铁练这几道- 26. 删除排序数组中的重复项快慢指针的经典应用- 283. 移动零和移除元素思路几乎一致- 844. 比较含退的字符串相向双指针的练习。坚持每天刷题慢慢就能看到自己的进步啦

更多文章