我是靠谱客的博主 含蓄毛巾,这篇文章主要介绍LeetCode-27 移除元素(双指针算法),现在分享给大家,希望可以做个参考。

给你一个数组 nums 和一个值 val,你需要 原地 移除所有数值等于 val 的元素,并返回移除后数组的新长度。不要使用额外的数组空间,你必须仅使用 O(1) 额外空间并 原地 修改输入数组。元素的顺序可以改变。你不需要考虑数组中超出新长度后面的元素。

示例

示例一

复制代码
1
2
3
4
给定 nums = [3,2,2,3], val = 3, 函数应该返回新的长度 2, 并且 nums 中的前两个元素均为 2。 你不需要考虑数组中超出新长度后面的元素。

示例二

复制代码
1
2
3
4
5
给定 nums = [0,1,2,2,3,0,4,2], val = 2, 函数应该返回新的长度 5, 并且 nums 中的前五个元素为 0, 1, 3, 0, 4。 注意这五个元素可为任意顺序。 你不需要考虑数组中超出新长度后面的元素。

题解

双指针
这道题本质上与LeetCode-26 删除排序数组中的重复项(双指针)本质上是相同的,同向指针和相向指针均可以解出这道题

方法一:同侧指针

复制代码
1
2
3
4
5
6
7
8
9
10
11
12
13
class Solution { public int removeElement(int[] nums, int val) { int i=0; for (int j=0;j<nums.length;j++){ if (nums[j]!=val){ nums[i]=nums[j]; i++; } } return i; } }

两个指针,一个快指针J,遍历数组;一个慢指针i记录结果数组(主要记录遍历时与参数不相等的数组元组)

方法二:双侧指针

复制代码
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
class Solution { public int removeElement(int[] nums, int val) { int i=0; int j=nums.length; while (i<j){ if (nums[i]==val){ nums[i]=nums[j-1]; j--; } else { i++; } } return i; } }

当头指针小于小于尾指针时,判断头指针是否与参数相同,如果相同,则将尾指针元素赋值给头指针,因为交换后的尾指针必定等于参数,所以尾指针前移,这样相当于删除了一个指定元素。当然,如果交换之前尾指针也等于参数,那么下次while循环中依然会检测头指针(上一次循环尾指针的值)。
如果头指针元素与参数不同,头指针后移,从下一个元素进行判断。

最后

以上就是含蓄毛巾最近收集整理的关于LeetCode-27 移除元素(双指针算法)的全部内容,更多相关LeetCode-27内容请搜索靠谱客的其他文章。

本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
点赞(60)

评论列表共有 0 条评论

立即
投稿
返回
顶部