leetcode第27题

简介: 上边的解法,我们是如果不等于 val 就赋值。但如果按题目的想法,应该是如果等于 val 就移除。我们从正方面去想,也就是等于 val 的话,我们怎么体现移除呢?题目中有个说明我们没利用到,他告诉我们说 the order of those five elements can be arbitrary,就是说数组的顺序可以随便换,我们怎么充分利用呢?我们可以这样,如果当前元素等于 val 了,我们就把它扔掉,然后将最后一个值赋值到当前位置,并且长度减去 1。什么意思呢?比如 1 2 2 4 6,如果 val 等于 2 。那么当移动到 2 的时候,等于 val 了。我们就把最后一个位置的

image.png

top27

上一题类似,只不过这个是去除给定的值,看起来还更简单些。

例如给了 nums = [ 3, 2, 2, 3 ],val = 3, 然后我们返回 len = 2,并且 nums 修改为 [ 2, 2 ] 。

解法一

和上道题一样,我们利用快慢指针,此外我们还得用下反向的思维。快指针 fast 和慢指针 slow,一直移动 fast ,如果 fast 指向的值不等于给定的 val ,我们就将值赋给 slow 指向的位置,slow 后移一位。如果 fast 指向的值等于 val 了,此时 fast 后移一位就可以了,不做其他操作

publicintremoveElement(int[] nums, intval) {
intfast=0;
intslow=0;
while (fast<nums.length) {
if (nums[fast] !=val) {
nums[slow++] =nums[fast];
        }
fast++;
    }
returnslow;
}

时间复杂度:O(n)。

空间复杂度:O(1)。

解法二

参考给出的Soloution

上边的解法,我们是如果不等于 val 就赋值。但如果按题目的想法,应该是如果等于 val 就移除。我们从正方面去想,也就是等于 val 的话,我们怎么体现移除呢?

题目中有个说明我们没利用到,他告诉我们说 the order of those five elements can be arbitrary,就是说数组的顺序可以随便换,我们怎么充分利用呢?

我们可以这样,如果当前元素等于 val 了,我们就把它扔掉,然后将最后一个值赋值到当前位置,并且长度减去 1。什么意思呢?

比如 1 2 2 4 6,如果 val 等于 2 。那么当移动到 2 的时候,等于 val 了。我们就把最后一个位置的 6 赋值过来,长度减去 1 。就变成了 1 6 2 4。完美!达到了移除的效果。然后当又移动到新的 2 的时候,就把最后的 4 拿过来,变成 1 6 4,达到了移除的效果。看下代码吧。

publicintremoveElement(int[] nums, intval) {
inti=0;
intn=nums.length;
while (i<n) {
if (nums[i] ==val) {
nums[i] =nums[n-1]; 
n--;
        } else {
i++;
        }
    }
returnn;
}

时间复杂度:同样是 O(n),但如果等于 val 的值比较少,解法二会更有效率些。比如 1 2 3 4,val = 2。解法一 while 循环中将调用 3 次赋值。而解法二中,仅仅当等于 val 的时候赋值 1 次。

空间复杂度:O(1)。

Solution 给出的想法让人耳目一新,对于移除的值少的情况,优化了不少。


相关文章
|
运维 Linux Shell
|
2月前
|
人工智能 SEO
智能体最新消息:从技术爆点到产业浪潮,三大趋势透视下一代人机协作范式
2024年AI智能体爆发,正重塑商业与职业格局。三大趋势凸显:智能体从工具升为战略核心,驱动企业模式创新;能力平民化催生“智能体操盘手”新职业;政策与资本共推教育生态成型。智能体已成工作新常态,时代变革亟待主动拥抱。
|
9月前
|
缓存 NoSQL Java
Redis应用—8.相关的缓存框架
本文介绍了Ehcache和Guava Cache两个缓存框架及其使用方法,以及如何自定义缓存。主要内容包括:Ehcache缓存框架、Guava Cache缓存框架、自定义缓存。总结:Ehcache适合用作本地缓存或与Redis结合使用,Guava Cache则提供了更灵活的缓存管理和更高的并发性能。自定义缓存可以根据具体需求选择不同的数据结构和引用类型来实现特定的缓存策略。
613 16
Redis应用—8.相关的缓存框架
|
数据可视化 数据挖掘 新能源
2024年五大备受瞩目的数据可视化工具推荐
在当今数据驱动的时代,数据可视化工具已成为各行各业不可或缺的助手。这些工具不仅能够帮助用户更好地理解和分析数据,还能将数据转化为洞察,从而支持更明智的决策。以下是2024年五大备受瞩目的数据可视化工具推荐,每款工具都有其独特的优势和适用场景。
|
存储 C语言
C语言学习记录——动态内存函数介绍(malloc、free、calloc、realloc)
C语言学习记录——动态内存函数介绍(malloc、free、calloc、realloc)
1806 1
|
11月前
|
人工智能 安全 Android开发
《鸿蒙系统AI优势:超越安卓,开启智能新篇》
鸿蒙系统在人工智能浪潮中展现出独特优势。其系统级原生智能简化开发,AI大模型接入提升智慧交互,微内核架构保障安全稳定,分布式架构实现多设备无缝协同,隐私保护措施全面,智能检测实时防护。相比安卓,鸿蒙在开发效率、智能性、安全性及用户体验上更具竞争力,为用户带来更智能、便捷、安全的使用体验。
1121 6
|
数据处理 Python
Python 高级技巧:深入解析读取 Excel 文件的多种方法
在数据分析中,从 Excel 文件读取数据是常见需求。本文介绍了使用 Python 的三个库:`pandas`、`openpyxl` 和 `xlrd` 来高效处理 Excel 文件的方法。`pandas` 提供了简洁的接口,而 `openpyxl` 和 `xlrd` 则针对不同版本的 Excel 文件格式提供了详细的数据读取和处理功能。此外,还介绍了如何处理复杂格式(如合并单元格)和进行性能优化(如分块读取)。通过这些技巧,可以轻松应对各种 Excel 数据处理任务。
746 16
别再问我们用什么画图的了!问就是excalidraw
别再问我们用什么画图的了!问就是excalidraw
别再问我们用什么画图的了!问就是excalidraw
|
Web App开发 前端开发
canvas保存图片时,谷歌浏览器Chrome报错【解决方案】Not allowed to navigate top frame to data URL
canvas保存图片时,谷歌浏览器Chrome报错【解决方案】Not allowed to navigate top frame to data URL
725 0
|
关系型数据库 MySQL Shell
深入了解Linux /etc/passwd文件
深入了解Linux /etc/passwd文件
946 0