题目说明:
给你一个有序数组 nums ,请你 原地 删除重复出现的元素,使每个元素 只出现一次 ,返回删除后数组的新长度。
不要使用额外的数组空间,你必须在 原地 修改输入数组 并在使用 O(1) 额外空间的条件下完成。
分析:
题目给的有序数组,本身就是从小到大排序好的,不需要重新排序;既然要删除重复的元素,那么就从数组的第一个元素进行遍历,设置两个下标index1(表示保留下来的元素下标)、index2(表示原数组元素下标)。
最开始index1,index2都在第一个元素的位置,之后开始比较,如果index2表示的值等于index1表示的值,index1不变,index2++;如果index2表示的值不等于index1表示的值,那么index1++,并把index2当前的值赋给index2,index2++;以此类推,直至遍历完整个数组。
代码如下:
1 #include<stdio.h> 2 int removeDuplicates(int* nums, int numsSize){ 3 if(numsSize==0){ 4 return 0; 5 6 } 7 int index1=1,index2=1; 8 while(index2<numsSize){ 9 if(nums[index2]!=nums[index2-1]){ 10 nums[index1]=nums[index2]; 11 ++index1; 12 } 13 ++index2; 14 } 15 return index1; 16 } 17 18 int main(){ 19 int numsSize,i,length; 20 numsSize = 5; 21 int nums[5] = {1,2,2,3,4}; 22 length = removeDuplicates(nums,numsSize); 23 printf("删除后数组长度为:%d\n",length); 24 printf("删除后数组为:["); 25 for(i=0;i<length-1;i++){ 26 printf("%d,",nums[i]); 27 } 28 printf("%d",nums[length]); 29 printf("]"); 30 return 0; 31 }
运行截图:
这个算法算是比较基础的,其重点就在重复比较,思路能够保证稳定性和易用性,如果有收获那就点个赞呗!