题目
给你一个数组 nums 和一个值 val,你需要 原地 移除所有数值等于 val 的元素,并返回移除后数组的新长度。不要使用额外的数组空间,你必须仅使用 O(1) 额外空间并 原地 修改输入数组。
示例 1:
给定 nums = [3,2,2,3], val = 3,
函数应该返回新的长度 2, 并且 nums 中的前两个元素均为 2。
题解
(1)使用双指针,简直好简单。指针i
= 0,指针n
= 数组长度。找到目标数
换最后位数,长度-1
,相当于删除。继续与目标数比较,返回n
1 | var removeElement = function(nums, val) { |
快慢指针:
1 | // 双指针 |
(2)使用splice函数,本人一开始就是这么做的,奈何没有想到的一点是,splice函数中数组中元素删除后会自动更新数组,索引值就变了,和以前的数组不一样了。这样在循环的时候,就会出现问题,但是当时没有想到可以用两个变量,一个进行循环,一个进行计数。代码如下:
1 | var removeElement = function(nums, val) { |
这里还有一个高级的用法,就是倒序循环,这样使用splice函数的时候,就不需要在乎索引的问题了,索引是向前缩进,不影响倒序的循环。(不得不说一句,聪明的人好多,可是我却不是。呜呜呜!)
1 | var removeElement = function(nums, val) { |
(3)直接就是循环。需要两个变量搞定。
1 | var removeElement = function (nums, val) { |
(4)数组移除
1 | var removeElement = function(nums, val) { |
题目
给定一个排序数组,你需要在 原地 删除重复出现的元素,使得每个元素只出现一次,返回移除后数组的新长度。不要使用额外的数组空间,你必须在 原地 修改输入数组 并在使用 O(1) 额外空间的条件下完成。
示例 1:
给定数组 nums = [1,1,2],
函数应该返回新的长度 2, 并且原数组 nums 的前两个元素被修改为 1, 2。
题解
该题思想与上面的移除元素思想雷同,这里直接写想法。(都是自己想的还挺鸡冻哈哈哈哈)
(1)快慢指针法(双指针)
1 | var removeDuplicates = function(nums) { |
这道题目还可以继续使用快慢指针来来解决, 最开始的时候,两个指针都指向第一个数字,如果两个指针指向的数字相同,则快指针向前走一步,如果不同,则两个指针都向前走一步,然后将当前快指针的值赋给慢指针所在的值,这样当快指针走完整个数组后,慢指针当前的坐标+1就是数组中不同数字的个数。
1 | var removeDuplicates = function (nums) { |
(2)倒序法
1 | var removeDuplicates = function(nums) { |
(3)如果借用js原生的api,这个题目中 for 循环遍历一遍数组,如果前一个元素和后一个元素相同 则就地删除这个元素,这里有一个细节,就是原地删除元素之后, 需要将循环变量更新一下。但是这样复杂度就变高了。
1 | var removeDuplicates = function (nums) { |
(4)懂得自然懂
1 | var removeDuplicates = function (nums) { |
Author: Amanda-Zhang
Link: http://chunchunya.github.io/2021/01/07/1.06_%E7%A7%BB%E9%99%A4%E5%85%83%E7%B4%A0/
Copyright: All articles in this blog are licensed under CC BY-NC-SA 3.0 unless stating additionally.