力扣每日一题——NO.26删除有序数组中的重复项(c语言实现)
Posted 东条希尔薇
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了力扣每日一题——NO.26删除有序数组中的重复项(c语言实现)相关的知识,希望对你有一定的参考价值。
题目描述:
给你一个有序数组 nums ,请你 原地 删除重复出现的元素,使每个元素 只出现一次 ,返回删除后数组的新长度。
不要使用额外的数组空间,你必须在 原地 修改输入数组 并在使用 O(1) 额外空间的条件下完成。
输入:nums = [1,1,2]
输出:2, nums = [1,2]
解释:函数应该返回新的长度 2 ,并且原数组 nums 的前两个元素被修改为 1, 2 。不需要考虑数组中超出新长度后面的元素。
分析:
我们很容易想到的方法就是暴力求解法:
指定一个i和j变量,i指示当前的位置,j用于向后检测,如果遇到相同数字,则将数据全部往前挪
图解:
但这是最基本的暴力求解法,复杂度已经高达o(n2),所以这种方法显然不行
我们可以考虑使用双指针法,可将复杂度提升至o(n)
用一个slow指针来依次存储元素,用fast来检测是否有相等元素
当slow与fast相等时,直接fast++
slow与fast不等,先slow++,将fast赋给slow,之后fast++
最后返回元素个数,我们返回slow+1即可
图解:
代码实现
int removeDuplicates(int* nums, int numsSize){
if(!numsSize)
{
return 0;
}
int slow=0;
int fast=0;
while(fast<numsSize)
{
if(nums[fast]==nums[slow])
{
fast++;
}
else
{
slow++;
nums[slow]=nums[fast];
fast++;
}
}
return slow+1;
}
以上是关于力扣每日一题——NO.26删除有序数组中的重复项(c语言实现)的主要内容,如果未能解决你的问题,请参考以下文章
leetcode 每日一题 80. 删除排序数组中的重复项 II