福州营销型网站建设价格,网站建设安全架构,焦作建设厅网站,中国建设银行总行官方网站文章目录#x1f428;1. 题目#x1f3f9;2. 思路#x1fa83;3. 代码实现#x1f428;1. 题目 给你一个升序排列的数组nums#xff0c;请你原地删除重复出现的元素#xff0c;使每个元素只出现一次#xff0c;返回删除后数组的新长度。元素的相对顺序应该保持一致。 由… 文章目录1. 题目2. 思路3. 代码实现1. 题目 给你一个升序排列的数组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 已按 升序 排列
2. 思路
这里题目对空间复杂度做了要求必须为 O(1) 那么我们就不能开辟新的数组只能在原数组上动手。题目还给出了一个条件——数组是有序的这就意味着如果重复的元素一定是相邻的。 这样我们就可以考虑用双指针因为要比较指向的内容是否相同所以这里不能指向同一个位置即我们设置一个前dst一个后src。
3. 代码实现 注意 这个函数的返回值是去重后的数组长度。在函数执行的过程中变量dst表示当前去重后的数组的最后一个元素的索引因此实际上需要返回的是dst 1。 int removeDuplicates(int* nums, int numsSize){int src 1;int dst 0;while(srcnumsSize){if(nums[dst] ! nums[src]){nums[dst] nums[src];}else{src;}}return dst1;
}