26. 删除排序数组中的重复项
给定一个排序数组,你需要在原地删除重复出现的元素,使得每个元素只出现一次,返回移除后数组的新长度。
不要使用额外的数组空间,你必须在原地修改输入数组并在使用 O(1) 额外空间的条件下完成。
示例 1:
给定数组 nums = [1,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。 你不需要考虑数组中超出新长度后面的元素。
在这里给新人一些提示,LeetCode中需要提交的代码之是真正程序的一个函数,
LeetCode会提供接口以便测试准备好的测试用例来判断题目是否被解决
我的代码1//报错,改变了数组顺序
int removeDuplicates(int* nums, int numsSize) { for (int i=0; i<numsSize; i++){ for (int j=i+1; j<numsSize; j++){ if (nums[i] == nums[j]){ nums[j] = nums[numsSize-1]; numsSize--; } } } return numsSize; }
我的代码2//虽然通过了,但是耗时极其长
int removeDuplicates(int* nums, int numsSize) { for (int i=0; i<numsSize; i++){ for (int j=i+1; j<numsSize; j++){ if (nums[i] == nums[j]){ for (int k=j; k<numsSize-1; k++){ nums[k] = nums[k+1]; } numsSize--; j--; } } } return numsSize; }
范例代码1//忘记了这道题是一个有序数组,比较相邻两位即可,而且需要注意对numsSize<=1的判断,循环中的内容也是意想不到的,设计了一个如果两数不同就递增的变量,代替numsSize
int removeDuplicates(int* nums, int numsSize) { int i , j = 0; int num; if(numsSize <= 1) return numsSize; for(i = 1; i < numsSize; i++) { if( nums[j] != nums[i]) { nums[++j] = nums[i]; } } return j+1; }
范例代码2//同样,循环中的内容值得学习
int removeDuplicates(int* nums, int numsSize) { if(numsSize==0)return 0; int count=1; int temp=nums[0]; //int prev; for(int i=1;i<numsSize;i++) { if(nums[i]>temp) { temp=nums[i]; nums[count]=temp; count++; } }return count; }
题目目的很明确,考察排序数组中对于重复项的检验以及数组原地删除
浙公网安备 33010602011771号