技术提高是一个循序渐进的过程,所以我讲的leetcode算法题从最简单的level开始写的,然后> 到中级难度,最后到hard难度全部完。目前我选择C语言,Python和Java作为实现语言,因为这三种语言还是比较典型的。由于篇幅和> 精力有限,其他语言的实现有兴趣的朋友请自己尝试。初级难度说的差不多的时候,我打算再加点其他内容,我可能会从操作系统到协议栈,从分布式> 聊到大数据框架,从大数据聊到人工智能,... ...。
如果有任何问题可以在文章后评论或者私信给我。
我会持续分享下去,敬请您的关注。
LeetCode 27. 删除元素(Remove Element)
问题描述:
给定一个数组nums和一个数值val,直接删除nums中所有值等于val的元素,然后返回nums新的长度。要求,不额外分配空间,空间复杂度要满足O(1)。对元素的顺序没有要求,顺序可以更改。不关心超过nums新长度以外的内容。
示例:
C语言实现:
这道题也是比较简单的,有两种算法可以实现,两种算法的不同之处在于:在nums找到一个val后,用哪一个元素与之互换。
第一种方法,拿右边离val的最近的非val元素与之互换。
换句话说,我们从val的右边向nums的末尾不断的寻找替换元素。
具体流程是:
- 定义两个整型数,i和j,i作为遍历nums的下标,j初始化为0。
- 遍历nums,如果当前元素nums[i]等于val,则:
1). 如果j等于0,则重新将j赋值为i+1;
2). 如果j不等于0,则j加1;
- 检查nums[j]是否等于val的,如果等于,j加1,继续检查nums[j];如果不等于val,则交换nums[i]和nums[j];如此直到j=len(nums)-1;
这样就完成了清除nums中所有val的任务。
但是关于新数组的长度通过这次遍历是无法知晓的。需要在这次遍历之前,先对nums进行一次遍历来统计nums中val元素的数量,然后在上面替换的时候通过不断的减去这个数量,来计算新数组的边界。
第二种方法,拿右边离val的最远的非val元素与之互换。
换句话说,我们从nums的末尾开始向左来不断的寻找替换元素。
具体流程是:
- 先定义一个整形变量i,初始化为nums的长度;
- 然后开始遍历数组。条件是下标不能超过i的值,因为遍历的方向是从左到右的,而寻找替换的方法是从右向左的,所以最终他们会相遇的。而相遇的时候也就是遍历结束的时候。
- 如果当前元素等于val,则开始从nums的末尾向右找不等于val的替换元素,一旦找到,完成替换,整个过程i值是在不断减小的。
这个算法的优点是,不用通过额外的遍历来检查nums中val的数量。
当循环结束的时候,i值就是新数组的长度,因为这个时候,nums[i]及其右边所有的元素都是等于val的,而nums[i]的左边都是完成替换,不等于val的元素。
我们的实现用的就是方法二,代码如下:
Java语言实现:
Java 的实现和C语言的实现一致,不再撰述。
代码如下:
Python语言实现:
Python 可以通过循环不断判断nums是否存在val,如果存在就删除,直到删除所有的val元素,然后返回新的nums长度。
代码如下:
谢谢大家一直以来的关注和支持!
我一直在努力的写好每一篇文章,画好每一份插图。但是作为一个996从业人员,时间精力十分有限。所以针对评论部分,以后只回答粉丝的问题和私信。希望仅仅是路过的朋友能够体谅,希望更多人关注《吾是我师》,谢谢!