博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
LeetCode解题思路:27. Remove Element
阅读量:6284 次
发布时间:2019-06-22

本文共 1618 字,大约阅读时间需要 5 分钟。

  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 = 3  Your function should return length = 2, with the first two elements of nums being 2.

题意:给出一个数组和一个值,原地挖掉数组中对应的值(以下以val代替),不允许使用新数组即空间复杂度O(1),返回长度并返回去掉val后的数组

错误思路:

  只看到了返回值,我开始的时候真的只看到了返回值。然后根本没去除掉val。所以最快去掉所有val并返回长度才是关键。

基本思路:

  如果不会特别的思路,就用一种比较慢的想法做也可以,每遇到一个val就把后面所有元素向前移动一位把val覆盖掉,并且让数组长度减1,如果val在最后一位那么数组长度直接减1。最坏情况时间复杂度O(n*n)。因为数据量比较小所以即使反复的对数据进行操作也不会特别慢。

1 int removeElement(int* nums, int numsSize, int val) { 2     int i=0, j =i+1; 3     for(i=0;i

  稍微优化一下,其实我们根本不在乎数组中除了val以外数字的顺序,所以我们可以遇到val时就把最后一个元素赋值给当前元素,然后数组长度减1。最后返回数组长度即可。最差时间复杂度O(n)。

1 int removeElement(int* nums, int numsSize, int val) {    2     int i=0; 3     while(i

  再优化一下,第三种方法,不见得比第二种好,但是代码至少看上去更短。

1 class Solution {2 public:3     int removeElement(vector
& nums, int val) {4 nums.erase(remove(nums.begin(),nums.end(),val),nums.end());5 return nums.size();6 }7 };

  使用了STL中的erase(remove())组合。底层实现其实有点像第二种,大致是如下,比如我们想删除容器中的99:

    

  如果我们把remove的返回值存放在一个叫做newEnd的新迭代器中,那么remove后应该就是这样的:

    

  而中间的过程,3个99被放在了尾部,用问号代替?然而实际上里面的元素是这样的:

    

  真实的移动情况是这样的:

    

  找到一个待覆盖位置,用后面第一个非val元素覆盖,则该位置变为新待覆盖位置,然后重复前面操作,直到最后一个元素,返回第一个待覆盖元素位置。

  这样做的好处在于不会改变数组中其他元素顺序并且时间复杂度较第一种方法要低(因为每次只查找少于n-i个元素,移动其中1个元素)。

  实现代码略。

 

转载于:https://www.cnblogs.com/hellomotty/p/7577136.html

你可能感兴趣的文章
SAP S/4HANA Cloud: Revolutionizing the Next Generation of Cloud ERP
查看>>
Mellanox公司计划利用系统芯片提升存储产品速度
查看>>
白帽子守护网络安全,高薪酬成大学生就业首选!
查看>>
ARM想将芯片装进人类大脑 降低能耗是一大挑战
查看>>
Oracle数据库的备份方法
查看>>
Selenium 自动登录考勤系统
查看>>
关于如何以编程的方式执行TestNG
查看>>
智能照明造福千家万户 家居智能不再是梦
查看>>
物联网如何跳出“看起来很美”?
查看>>
浅谈MySQL 数据库性能优化
查看>>
《UNIX/Linux 系统管理技术手册(第四版)》——1.10 其他的权威文档
查看>>
灵动空间 创享生活
查看>>
《UNIX网络编程 卷1:套接字联网API(第3版)》——8.6 UDP回射客户程序:dg_cli函数...
查看>>
不要将时间浪费到编写完美代码上
查看>>
《算法基础:打开算法之门》一3.4 归并排序
查看>>
高德开放平台开放源代码 鼓励开发者创新
查看>>
《高并发Oracle数据库系统的架构与设计》一2.5 索引维护
查看>>
Firefox 是 Pwn2own 2014 上攻陷次数最多的浏览器
查看>>
阿里感悟(十八)- 应届生Review
查看>>
话说模式匹配(5) for表达式中的模式匹配
查看>>