【LeetCode】27.移除元素
27.移除元素
知识点:数组;双指针;;
题目描述
给你一个数组 nums 和一个值 val,你需要 原地 移除所有数值等于 val 的元素,并返回移除后数组的新长度。
不要使用额外的数组空间,你必须仅使用 O(1) 额外空间并 原地 修改输入数组。
元素的顺序可以改变。你不需要考虑数组中超出新长度后面的元素。
示例1
输入:nums = [3,2,2,3], val = 3
输出:2, nums = [2,2]
解释:函数应该返回新的长度 2, 并且 nums 中的前两个元素均为 2。你不需要考虑数组中超出新长度后面的元素。例如,函数返回的新长度为 2 ,而 nums = [2,2,3,3] 或 nums = [2,2,0,0],也会被视作正确答案。
示例2
输入:nums = [0,1,2,2,3,0,4,2], val = 2
输出:5, nums = [0,1,4,0,3]
解释:函数应该返回新的长度 5, 并且 nums 中的前五个元素为 0, 1, 3, 0, 4。注意这五个元素可为任意顺序。你不需要考虑数组中超出新长度后面的元素。
解法一:左双指针
这道题可以用和283题一模一样的方法去做,都是在移动一个指定元素,将不等于这个元素的都移动到最前面就可以了;
class Solution {
public int removeElement(int[] nums, int val) {
int index = 0;
for(int i = 0; i < nums.length; i++){
if(nums[i] != val){
nums[index] = nums[i];
index++;
}
}
return index;
}
}
时间复杂度:O(N);但是我们有两个指针从左到右,最差情况需要遍历两次数组;
解法二:首尾双指针
这道题和之前的283题中有一个区别:这道题目不用保持相对顺序;也就是把不等于val的值都移动到最前面就可以了,不用管它们之间的顺序。
遇到这种不用保持相对顺序的往往就不需要从前向后了,可以用首尾双指针,类似于快速排序;首指针逐渐增大,遇到等于val的停下,尾指针不断减小,遇到不等于val的停下,然后两者互换,然后接着走,直到两个指针碰面,这就相当于把数组遍历完了。
class Solution {
public int removeElement(int[] nums, int val) {
if(nums == null || nums.length == 0) return 0; //边界条件
int left = 0;
int right = nums.length - 1;
while(left < right){
while(left < right && nums[left] != val){
left++;
}
while(left < right && nums[right] == val){
right--;
}
int temp = nums[left];
nums[left] = nums[right];
nums[right] = temp;
}
if(nums[left] == val) return left;
//首尾双指针的时候常在最后用到的判断方法,判断停下来的时候是落在哪了,如果落在不等于val值上,那要加1;如果等于val的时候,那就正好;
else return left+1;
}
}
时间复杂度:O(N);但是这种首尾指针碰头的方法,最多只需要遍历一次数组;
体会
快速排序的首尾双指针碰面的想法经常用到,这样可以有效的减少遍历数组的次数;
如果是要保持相对位置,那就只能从左到右,用左双指针;如果对相对顺序没有要求,那么就可以从两边开始,然后根据题目要求去交换首尾指针指向的元素。;
【LeetCode】27.移除元素的更多相关文章
- 前端与算法 leetcode 27.移除元素
目录 # 前端与算法 leetcode 27.移除元素 题目描述 概要 提示 解析 算法 @(目录) # 前端与算法 leetcode 27.移除元素 题目描述 27.移除元素 概要 题目本身其实挺简 ...
- Java实现 LeetCode 27 移除元素
27. 移除元素 给定一个数组 nums 和一个值 val,你需要原地移除所有数值等于 val 的元素,返回移除后数组的新长度. 不要使用额外的数组空间,你必须在原地修改输入数组并在使用 O(1) 额 ...
- [Leetcode]27. 移除元素
题目描述: ++难度:简单++ 给定一个数组 nums 和一个值 val,你需要原地移除所有数值等于val 的元素,返回移除后数组的新长度. 不要使用额外的数组空间,你必须在原地修改输入数组并在使用 ...
- Leetcode 27.移除元素 By Python
给定一个数组 nums 和一个值 val,你需要原地移除所有数值等于 val 的元素,返回移除后数组的新长度. 不要使用额外的数组空间,你必须在原地修改输入数组并在使用 O(1) 额外空间的条件下完成 ...
- leetcode 27. 移除元素(python)
1. 题目描述 给定一个数组 nums 和一个值 val,你需要原地移除所有数值等于 val 的元素,返回移除后数组的新长度. 不要使用额外的数组空间,你必须在原地修改输入数组并在使用 O(1) 额外 ...
- [LeetCode]27.移除元素(Java)
原题地址: remove-element 题目描述: 给你一个数组 nums 和一个值 val,你需要 原地 移除所有数值等于 val 的元素,并返回移除后数组的新长度. 不要使用额外的数组空间,你必 ...
- LeetCode:27 移除元素
给定一个数组 nums 和一个值 val,你需要原地移除所有数值等于 val 的元素,返回移除后数组的新长度. 不要使用额外的数组空间,你必须在原地修改输入数组并在使用 O(1) 额外空间的条件下完成 ...
- python刷LeetCode:27. 移除元素
难度等级:简单 题目描述: 给定一个数组 nums 和一个值 val,你需要原地移除所有数值等于 val 的元素,返回移除后数组的新长度. 不要使用额外的数组空间,你必须在原地修改输入数组并在使用 O ...
- 力扣(LeetCode) 27. 移除元素
给定一个数组 nums 和一个值 val,你需要原地移除所有数值等于 val 的元素,返回移除后数组的新长度. 不要使用额外的数组空间,你必须在原地修改输入数组并在使用 O(1) 额外空间的条件下完成 ...
随机推荐
- 3DPytorch-API NVIDIA Kaolin
3DPytorch-API NVIDIA Kaolin NVIDIA Kaolin library provides a PyTorch API for working with a variety ...
- JUC 并发编程--08,线程池,三大方法,七大参数,4种拒绝策略,代码演示
三大方法: //线程池核心线程数为n, 最大线程数为 n ExecutorService fixedThreadPool = Executors.newFixedThreadPool(n); 源码: ...
- 编译原理-非确定有穷自动机(nondeterministic finite automata,NFA)
是一个五元组,M=(S,∑,f,S0,F) S:有穷状态集 ∑:输入字母表(有穷) f:f(S,α)=S' 表示从一个状态S出发,识别了一个字α后,可以到达S'这个状态集合之间的某一个状态(可能的后继 ...
- 深入 Go 中各个高性能 JSON 解析库
转载请声明出处哦~,本篇文章发布于luozhiyun的博客:https://www.luozhiyun.com/archives/535 其实本来我是没打算去看 JSON 库的性能问题的,但是最近我对 ...
- Spring Cloud02:Eureka Server注册中心
一.Eureka是什么 Eureka是Netflix开源的基于REST的服务治理方案,Spring Cloud集成了Eureka,提供服务治理和服务发现功能,可以和基于Spring Boot搭建的微服 ...
- 十二、iptables基本管理
关闭firewalld,启动iptables服务 [root@proxy ~]# systemctl stop firewalld.service //关闭firewalld服务器 [root ...
- 新增秒杀功能、优惠券、支付宝、Docker,newbee-mall升级版开源啦!
最近是非常非常非常忙,一方面是公司的事情比较多,另外⼀点是最近在准备诉讼材料.⾄于诉讼的是谁,⼤家可以去看我之前写的几篇文章,所以本来这周是不打算更新文章的.不过,昨天慕课网的法务联系我的律师了,终于 ...
- .Net Redis实战指南——常用命令
本问主要介绍rabbitmqctl工具的常用命令. vhost 一个RabbitMQ服务器可以创建多个虚拟的消息服务器,称之为虚拟主机(virtual host),简称为vhost.vhost之间是绝 ...
- 【NX二次开发】PMI线性标注
PMI线性标注,二次开发的难点在于控制尺寸的位置,多花点儿时间都能搞出来,想走捷径最下面就是源码. 只需要摆好工作坐标,然后指定你要标注尺寸的两个点,就可以很方便得利用这个封装函数做出你想要的PMI. ...
- Unicode编码转换, MD5加密,URL16进制加密解密
一.站长网址:http://www.msxindl.com/ 1.Unicode与中文互转 16进制Unicode编码转换.还原 :http://www.msxindl.com/tools/uni ...