文章目录

26. 删除有序数组中的重复项:样例 1:样例 2:提示:

分析:题解:rustgoc++cpythonjava

26. 删除有序数组中的重复项:

给你一个 升序排列 的数组 nums ,请你 原地 删除重复出现的元素,使每个元素 只出现一次 ,返回删除后数组的新长度。元素的 相对顺序 应该保持 一致 。

由于在某些语言中不能改变数组的长度,所以必须将结果放在数组nums的第一部分。更规范地说,如果在删除重复项之后有 k 个元素,那么 nums 的前 k 个元素应该保存最终结果。

将最终结果插入 nums 的前 k 个位置后返回 k 。

不要使用额外的空间,你必须在 原地 修改输入数组 并在使用 O(1) 额外空间的条件下完成。

样例 1:

输入:

nums = [1,1,2]

输出:

2, nums = [1,2,_]

解释:

函数应该返回新的长度 2 ,并且原数组 nums 的前两个元素被修改为 1, 2 。不需要考虑数组中超出新长度后面的元素。

样例 2:

输入:

nums = [0,0,1,1,1,2,2,3,3,4]

输出:

5, nums = [0,1,2,3,4]

解释:

函数应该返回新的长度 5 , 并且原数组 nums 的前五个元素被修改为 0, 1, 2, 3, 4 。不需要考虑数组中超出新长度后面的元素。

提示:

1 <= nums.length <= 3 * 104-104 <= nums[i] <= 104nums 已按 升序 排列

分析:

面对这道算法题目,二当家的陷入了沉思。删除重复,本来需要一个哈希表之类的数据结构来检查重复。但是参数已经有序,也就意味着相同的数字一定连续,所以可以使用双指针,检查前后两个数字不同的才放入结果。

题解:

rust

impl Solution {

pub fn remove_duplicates(nums: &mut Vec) -> i32 {

let (n, mut slow, mut fast) = (nums.len(), 1usize, 1usize);

while fast < n {

if nums[fast] != nums[fast - 1] {

nums[slow] = nums[fast];

slow += 1;

}

fast += 1;

}

return slow as i32;

}

}

go

func removeDuplicates(nums []int) int {

n, slow, fast := len(nums), 1, 1

for fast < n {

if nums[fast] != nums[fast-1] {

nums[slow] = nums[fast]

slow++

}

fast++

}

return slow

}

c++

class Solution {

public:

int removeDuplicates(vector& nums) {

int n = nums.size(), slow = 1, fast = 1;

while (fast < n) {

if (nums[fast] != nums[fast - 1]) {

nums[slow] = nums[fast];

++slow;

}

++fast;

}

return slow;

}

};

c

int removeDuplicates(int* nums, int numsSize){

int slow = 1, fast = 1;

while (fast < numsSize) {

if (nums[fast] != nums[fast - 1]) {

nums[slow] = nums[fast];

++slow;

}

++fast;

}

return slow;

}

python

class Solution:

def removeDuplicates(self, nums: List[int]) -> int:

n, slow, fast = len(nums), 1, 1

while fast < n:

if nums[fast] != nums[fast - 1]:

nums[slow] = nums[fast]

slow += 1

fast += 1

return slow

java

class Solution {

public int removeDuplicates(int[] nums) {

final int n = nums.length;

int slow = 1, fast = 1;

while (fast < n) {

if (nums[fast] != nums[fast - 1]) {

nums[slow] = nums[fast];

++slow;

}

++fast;

}

return slow;

}

}

非常感谢你阅读本文~ 欢迎【点赞】【收藏】【评论】~ 放弃不难,但坚持一定很酷~ 希望我们大家都能每天进步一点点~ 本文由 二当家的白帽子:https://le-yi.blog.csdn.net/ 博客原创~