[LeetCode] Remove Element (三种解法)
Given an array and a value, remove all instances of that value in place and return the new length.
The order of elements can be changed. It doesn't matter what you leave beyond the new length.
这题做下来感觉技巧性比较强,解出第一种解法以后我又尝试了另外两种解法,一个比一个简单。。。我一开始却折腾出了最晦涩的解法,可见一开始并没有对题目有深刻的理解。
首先说说第一种解法,思路就是:维护一个表示“下一个交换位置”的指针ex,初始为-1。遍历数组,当找到第一个elem的位置时,将ex指向他,
然后程序要做的就是在遍历过程中检查ex是否存在,存在的话就把当前数挪到ex处,同时把ex向前移动一位。
但是要注意一点是,当再次遇到elem时ex是不更新的。(也就是ex只是在elem第一次出现的时候为其赋值,然后就只用递增他就行了)
int removeElement(int A[], int n, int elem) {
int ex = -;
int len = n;
for (int i = ; i < n; i++) {
if (A[i] == elem) {
len--;
if (ex < )
ex = i;
}
else if (ex >= ) {
A[ex] = A[i];
ex++;
}
}
return len;
}
这个解法虽然略显晦涩,但好处就是时间复杂度是O(n),空间复杂度是O(1) ,算是一个比较理想的结果。
解法二:空间复杂度O(n)
使用额外的空间可以使思路变得简单,要做的就是从A里面逐一拷贝元素到aux里,其中跳过elem就行了。缺点就是提升了空间复杂度,还有到最后需要把aux
的值在重新赋值给A,这样时间复杂度也多了一倍到达了theta(2n),空间复杂度为O(n)
int removeElement2(int A[], int n, int elem) {
int len = n;
int aux[n];
int k = ;
for (int i = ; i < n; i++) {
if (A[i] == elem) {
len--;
}
else {
aux[k++] = A[i];
}
}
for (int i = ; i < len; i++) {
A[i] = aux[i];
}
return len;
}
解法三:认真观察删除操作的性质会发现,删除一个元素不过就是把他后面的元素向前移动一位,那删除两个不就是移动两位,三个就是三位。。。以此类推。
所以我们只用在遍历数组的时候跟踪删除的个数n,然后同时将元素向后挪动n位就可以了,就这么简单。
int removeElement3(int A[], int n, int elem) {
int l = ;
for (int i = ; i < n; i++) {
if (A[i] == elem) {
l++;
}
else if (l > ){
A[i-l] = A[i];
}
}
return n-l;
}
[LeetCode] Remove Element (三种解法)的更多相关文章
- LeetCode算法题-Move Zeroes(Java实现-三种解法)
这是悦乐书的第201次更新,第211篇原创 01 看题和准备 今天介绍的是LeetCode算法题中Easy级别的第67题(顺位题号是283).给定一个数组nums,写一个函数将所有0移动到它的末尾,同 ...
- LeetCode算法题-First Bad Version(Java实现-三种解法)
这是悦乐书的第200次更新,第210篇原创 01 看题和准备 今天介绍的是LeetCode算法题中Easy级别的第66题(顺位题号是278).您是产品经理,目前领导团队开发新产品.不幸的是,您产品的最 ...
- jQuery中detach&&remove&&empty三种方法的区别
jQuery中empty&&remove&&detach三种方法的区别 empty():移除指定元素内部的所有内容,但不包括它本身 remove():移除指定元素内部的 ...
- [LeetCode] Remove Element 分析
Remove Element算是LeetCode的一道水题,不过这题也有多种做法,现就我所知的几种做一点讨论. 题目链接:https://leetcode.com/problems/remove-el ...
- [LeetCode] Remove Element题解
Remove Element: Given an array and a value, remove all instances of that value in place and return t ...
- LeetCode 647. Palindromic Substrings的三种解法
转载地址 https://www.cnblogs.com/AlvinZH/p/8527668.html#_label5 题目详情 给定一个字符串,你的任务是计算这个字符串中有多少个回文子串. 具有不同 ...
- [LeetCode] Remove Element 移除元素
Given an array and a value, remove all instances of that value in place and return the new length. T ...
- LeetCode Remove Element
原题链接在这里:https://leetcode.com/problems/remove-element/ 题目: Given an array and a value, remove all ins ...
- UVALive 6257 Chemist's vows --一道题的三种解法(模拟,DFS,DP)
题意:给一个元素周期表的元素符号(114种),再给一个串,问这个串能否有这些元素符号组成(全为小写). 解法1:动态规划 定义:dp[i]表示到 i 这个字符为止,能否有元素周期表里的符号构成. 则有 ...
随机推荐
- EXTJS 6 必填项加星号*
/**重写ext filed组件, 实现表单必填项加红色*星号**/ Ext.override(Ext.form.field.Base,{ initComponent:function(){ if(t ...
- host位置
windows xp/2003/vista/2008用户HOSTS文件是在“c:\windows\system32\drivers\etc”
- Android自定义图形shape
在Android开发过程中,经常需要改变控件的默认样式, 那么通常会使用多个图片来解决.不过这种方式可能需要多个图片,比如一个按钮,需要点击时的式样图片,默认的式样图片. 这样就容易使apk变大.另一 ...
- SpringMVC中Controller跳转到另一个Controller方法
1.直接Redirect后加 Controller/Action Response.Redirect("/User/Edit"); return Redirect("/U ...
- echo 单引号和双引号
echo输出 $key=value echo "$key" echo 后面带双引号的话,双引号里面的内容会翻译,输出value echo '$key' echo后面带单引号的话,双 ...
- redis pub/sub 实战: 微信语音识别
2015年5月22日 20:20:20 星期五 效果: 这边对微信说话, 浏览器端及时显示语音识别的文字 注意: 在连接socket.io时, 按下浏览器f12, 如果一直有请求不断的刷, 说明so ...
- ffmpeg-20160816-bin.7z
ESC 退出 0 进度条开关 1 屏幕原始大小 2 屏幕1/2大小 3 屏幕1/3大小 4 屏幕1/4大小 S 下一帧 [ -2秒 ] +2秒 ; -1秒 ' +1秒 下一个帧 -> -5秒 f ...
- java Thread和Runnable区别
①Thread类实现了Runnable接口,主要构造方法为Thread(Runnable target).Thread(Runnable target,String name).Thread(Stri ...
- EMIS系统运行时提示【无法验证发行者,您确实要运行此软件吗? 】
无法验证发行者,您确实要运行此软件吗? 遇到这个提示你怎么办? 运行 gpedit.msc 进入组策略用户配置 ==>管理模板==> winows组件 ==> 附件管理器在 &quo ...
- 用 get 同步/异步 方式获取网络数据并输出
//同步请求 //创建NSString用来存储请求的网址 NSString* str=@"http://v.juhe.cn/weather/index?format=2&cityna ...