LeetCode 27.移除元素

移除元素

给你一个数组 nums 和一个值 val,你需要 原地 移除所有数值等于 val 的元素,并返回移除后数组的新长度。

不要使用额外的数组空间,你必须仅使用 O(1) 额外空间并 原地 修改输入数组。

元素的顺序可以改变。你不需要考虑数组中超出新长度后面的元素。

方法一、双指针

注意到上述描述中存在"元素的顺序可以改变 ",数组无序,目的是去重,那么我们使用双指针来遍历及操作。

定义双指针left和right,left从0开始向右侧遍历,right从最后一位开始向左侧遍历,最坏情况下只遍历一次数组,效率较高。

当left值等于val时,将right位置的值赋值给left,right减1向左侧移动一位,下次若还相同,则继续将right位置的值赋值给left,right减1向左侧移动一位,直至left位置的值不等于val,将left加1,右移一位。代码如下:

Swift

swift 复制代码
func removeElement(_ nums: inout [Int], _ val: Int) -> Int {
        guard nums.count > 0 else {return 0}
        
        let cnt = nums.count
        var left = 0, right = cnt
        while left<right {
            if nums[left] == val {
                nums[left] = nums[right-1]
                right -= 1
            }else {
                left += 1
            }
        }
        return left
    }

OC

c 复制代码
- (NSInteger) removeElement:(NSMutableArray *)nums val:(NSInteger)val {
    if (nums.count <= 0) {
        return 0;
    }
    
    NSInteger left = 0, right = nums.count;
    while (left < right) {
        if ([nums[left] integerValue] == val) {
            nums[left] = nums[right-1];
            right--;
        }else {
            left++;
        }
    }
    
    return left;
}
相关推荐
使一颗心免于哀伤5 分钟前
《设计模式之禅》笔记摘录 - 8.命令模式
笔记·设计模式
牛奶咖啡135 分钟前
学习设计模式《十八》——备忘录模式
学习·设计模式·备忘录模式·认识备忘录模式·备忘录模式的优缺点·何时使用备忘录模式·备忘录模式的使用示例
大龄门外汉32 分钟前
CPP学习之list使用及模拟实现
windows·学习·list
超浪的晨39 分钟前
Java List 集合详解:从基础到实战,掌握 Java 列表操作全貌
java·开发语言·后端·学习·个人开发
超浪的晨1 小时前
Java Set 集合详解:从基础语法到实战应用,彻底掌握去重与唯一性集合
java·开发语言·后端·学习·个人开发
香蕉可乐荷包蛋1 小时前
Python学习之路(十三)-常用函数的使用,及优化
开发语言·python·学习
岩中竹1 小时前
广东省省考备考(第四十九天7.18)——判断推理:位置规律(听课后强化训练)
笔记
许白掰2 小时前
Linux入门篇学习——借助 U 盘或 TF 卡拷贝程序到开发板上
linux·学习·借助 u 盘拷贝程序到开发板上·借助 tf卡拷贝程序到开发板上
Norvyn_72 小时前
LeetCode|Day18|20. 有效的括号|Python刷题笔记
笔记·python·leetcode
呆呆的小鳄鱼2 小时前
leetcode:冗余连接 II[并查集检查环][节点入度]
算法·leetcode·职场和发展