【专知-关关的刷题日记15】Leetcode 27. Remove Element 方法1、2、3
题目
Given an array and a value, remove all instances of that value in place and return the new length.Do not allocate extra space for another array, you must do this in place with constant memory.The order of elements can be changed. It doesn't matter what you leave beyond the new length.
Example:Given input array nums = [3,2,2,3], val = 3Your function should return length = 2, with the first two elements of nums being 2.
题目的意思是给定一个数组和一个值,让在不开辟额外空间的情况下删掉数组中该值,并且返回除去该目标值之后数组的新长度。数组中元素的顺序可以发生变化。
方法1
方法1:最容易想到的,就是把目标值都删掉,然后返回数组的长度。每次erase的代价是O(n),算法时间复杂度O(n2)。
class Solution {
public:
int removeElement(vector<int>& nums, int val) {
for(int i=0; i<nums.size(); i++)
{
if(nums[i]==val)
{
nums.erase(nums.begin()+i);
i--;
}
}
return nums.size();
}
};
方法2
方法2:为了降低时间复杂度,可以先排个序,将目标值集中在一处进行批量删除,批量删除erase的时间复杂度是O(n),算法的时间复杂度是O(nlogn)。
class Solution {
public:
int removeElement(vector<int>& nums, int val) {
sort(nums.begin(),nums.end());
int flag=0, flag1,count=0;
for(int i=0; i<nums.size(); i++)
{
if(nums[i]==val)
{
if(flag==0)
{
flag1=i;
flag=1;
}
count++;
}
}
nums.erase(nums.begin()+flag1,nums.begin()+flag1+count);
return nums.size();
}
};
方法3
方法3:题目要求不能开辟新的空间,所以想到设置两个头尾指针进行元素互换,将所有目标值都换到数组的尾部。时间复杂度O(n)
class Solution {
public:
int removeElement(vector<int>& nums, int val) {
if(nums.empty())
return 0;
int temp=0;
for(int i=0, j=nums.size()-1; i<j;)
{
while(i<nums.size() && nums[i]!=val)
i++;
while(j>=0 && nums[j]==val)
j--;
if(i<j)
{
swap(nums[i],nums[j]);
}
}
for(int i=0; i<nums.size(); i++)
{
if(nums[i]==val)
return i;
}
return nums.size();
}
};
vector中erase的用法如下:iterator erase( iterator _Where);iterator erase( iterator _First, iterator _Last);如果是删除指定位置的元素时:返回值是一个迭代器,指向删除元素下一个元素;如果是删除某范围内的元素时:返回值也表示一个迭代器,指向最后一个删除元素的下一个元素;
仰望星空,脚踏实地,加油!
以上就是关关关于这道题的总结经验,希望大家能够理解,有什么问题可以在我们的专知公众号平台上交流或者加我们的QQ专知-人工智能交流群 426491390,也可以加入专知——Leetcode刷题交流群(请先加微信小助手weixinhao: Rancho_Fang)。
- 代码重写WordPress网页标题为“原网页标题|网站名”的形式
- 未来10年21个核心工作岗位
- Asp.net 2.0 WebPart使用经验点滴
- 使用LinqToExcel读取Excel
- 时代的需要:越来越多的Java工程师开始转向hadoop?
- 如何结合IbatisNet的LIST遍历实现模糊查询
- Flash/Flex学习笔记(41):碰撞检测
- [.NET网格计算框架] Alchemi
- 修改WordPress登陆文件名wp-login.php,防密码被暴力破解
- NDoc - .NET 代码文档生成器
- Mono P/Invoke :DLLImport
- MONO x64 amd_x64
- DN榜:最近3个域名成交金额均达到六位数美金
- 采访Philipp Crocoll:安卓平台上整合Java和C#
- JavaScript 教程
- JavaScript 编辑工具
- JavaScript 与HTML
- JavaScript 与Java
- JavaScript 数据结构
- JavaScript 基本数据类型
- JavaScript 特殊数据类型
- JavaScript 运算符
- JavaScript typeof 运算符
- JavaScript 表达式
- JavaScript 类型转换
- JavaScript 基本语法
- JavaScript 注释
- Javascript 基本处理流程
- Javascript 选择结构
- Javascript if 语句
- Javascript if 语句的嵌套
- Javascript switch 语句
- Javascript 循环结构
- Javascript 循环结构实例
- Javascript 跳转语句
- Javascript 控制语句总结
- Javascript 函数介绍
- Javascript 函数的定义
- Javascript 函数调用
- Javascript 几种特殊的函数
- JavaScript 内置函数简介
- Javascript eval() 函数
- Javascript isFinite() 函数
- Javascript isNaN() 函数
- parseInt() 与 parseFloat()
- escape() 与 unescape()
- Javascript 字符串介绍
- Javascript length属性
- javascript 字符串函数
- Javascript 日期对象简介
- Javascript 日期对象用途
- Date 对象属性和方法
- Javascript 数组是什么
- Javascript 创建数组
- Javascript 数组赋值与取值
- Javascript 数组属性和方法
- 「查缺补漏」巩固你的Nginx知识体系
- 超级帐本合约调用——fabric SDK Node调用TBaaS的合约
- TBaaS合约调用_fabric SDK Node 不使用Connection Profile
- helm安装、使用、实践
- 浅析asp .net core 中间件
- 玩转jenkins - 在自己的服务器上安装jenkins
- CPU有个禁区,内核权限也无法进入!
- Java bytecodes
- 云原生分布式深度学习初探
- 【原创】经验分享:一个Content-Length引发的血案(almost....)
- SAP Spartacus里使用Observable访问Component数据
- SAP Spartacus的b2cLayoutConfig
- python判断工作日,节假日
- Shell高级用法之重定向绑定
- 使用Pyspark进行特征工程时的那些坑