概述
给你一个数组 nums 和一个值 val,你需要 原地 移除所有数值等于 val 的元素,并返回移除后数组的新长度。不要使用额外的数组空间,你必须仅使用 O(1) 额外空间并 原地 修改输入数组。元素的顺序可以改变。你不需要考虑数组中超出新长度后面的元素。
示例
示例一
给定 nums = [3,2,2,3], val = 3,
函数应该返回新的长度 2, 并且 nums 中的前两个元素均为 2。
你不需要考虑数组中超出新长度后面的元素。
示例二
给定 nums = [0,1,2,2,3,0,4,2], val = 2,
函数应该返回新的长度 5, 并且 nums 中的前五个元素为 0, 1, 3, 0, 4。
注意这五个元素可为任意顺序。
你不需要考虑数组中超出新长度后面的元素。
题解
双指针
这道题本质上与LeetCode-26 删除排序数组中的重复项(双指针)本质上是相同的,同向指针和相向指针均可以解出这道题
方法一:同侧指针
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记录结果数组(主要记录遍历时与参数不相等的数组元组)
方法二:双侧指针
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 移除元素(双指针算法)所遇到的程序开发问题。
如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。
本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
发表评论 取消回复