第10天 删除有序数组中的重复项
今日任务26. 删除有序数组中的重复项 巩固双指针算法提交第二周学习小结题意给你一个 非严格递增排列 的数组 nums 请你 原地 删除重复出现的元素使每个元素 只出现一次 返回删除后数组的新长度。元素的 相对顺序 应该保持 一致 。然后返回 nums 中唯一元素的个数。考虑 nums 的唯一元素的数量为 k。去重后返回唯一元素的数量 k。nums 的前 k 个元素应包含 排序后 的唯一数字。下标 k - 1 之后的剩余元素可以忽略。题目链接hhttps://leetcode.cn/problems/remove-duplicates-from-sorted-array/视频链接https://www.bilibili.com/video/BV1fc2FByE4f/int removeDuplicates(int* nums, int numsSize) { // 数组为空直接返回 0 if (numsSize 0) { return 0; } // 慢指针 i指向去重后最后一个元素 int i 0; // 快指针 j 遍历整个数组 for (int j 1; j numsSize; j) { // 发现不重复的元素 if (nums[j] ! nums[i]) { i; // 慢指针后移 nums[i] nums[j]; // 把新元素覆盖过来 } } // 去重后的长度 i 1 return i 1; }慢指针 i记录去重数组的最后一位快指针 j遍历寻找新的不重复元素遇到不同元素时i 前进一位并把 nums [j] 赋值过来重复元素直接跳过不做处理最终返回i 1就是去重后的长度数组前i1个元素就是去重结果要求原地删除重复元素不能新开数组保留元素顺序返回去重后的长度数组前 k 位就是去重后的结果。思路步骤先处理特殊情况如果数组长度为 0直接返回 0。初始化慢指针 i 0默认第一个数字一定保留不需要删除。快指针 j 从 1 开始逐个遍历后面所有元素如果nums[j] ! nums[i]说明快指针找到了新的不重复元素慢指针向后走一步i把快指针的值覆盖到慢指针位置nums[i] nums[j]如果nums[j] nums[i]说明是重复元素快指针直接跳过什么都不做遍历结束后慢指针i是最后一个不重复元素的下标所以新数组长度 i 1例子数组[0,0,1,1,1,2,2,3,3,4]i0值 0j 从 1 开始j1值 0 nums [i]重复跳过j2值 1 ! 0 → i 变成 1nums [1]1j3、4都是 1和 nums [i]1 重复跳过j5值 2 ! 1 → i 变成 2nums [2]2j6重复跳过j7值 3 ! 2 → i 变成 3nums [3]3j8重复跳过j9值 4 ! 3 → i 变成 4nums [4]4最终 i4长度415数组前 5 位[0,1,2,3,4]