26. 刪除排序數組中的重復項
兩種方法的比較:
第一種方法,是前后兩個元素是否相等,如果不等,將其存儲到k所指示的地址中去,
第二種方法市殷,是比較數組中其他位置的元素是否跟當前k所指示的元素是否相等愕撰,如果不等,k + 1,存儲新元素醋寝,否則搞挣,i + 1 ,繼續(xù)判斷
方法二的效率更高一些
第一種方法
如果數組元素個數大于0音羞,那么必然至少有一個數字囱桨,所以設變量k=1,指示有多少個不重復的元素個數,只要 nums[i] == nums[i-1]嗅绰,我們增加i的值以跳過重復項舍肠,當我們遇到 只要nums[i] != nums[i-1] 的時候,重復運動已經結束窘面,我們必須把nums[i] 復制到 nums[k],然后遞增i,再次重復相同的過程翠语,知道i達到數組的末尾
int removeDuplicates(int* nums, int numsSize) {
if (numsSize == 0) return 0;
int k = 1;
for (int i = 1; i < numsSize; i++) {
if (nums[i] == nums[i-1]) continue;
nums[k++] = nums[i];
}
return k;
}
第二種方法
k是慢指針,i是快指針财边,只要nums[k] == nums[i] 我們增加i的值以跳過重復項,當我們遇到 只要nums[k] != nums[i] 的時候肌括,重復運動已經結束,我們必須把 nums[i] 復制到 nums[k + 1]酣难,然后遞增i,再次重復相同的過程谍夭,知道i達到數組的末尾
int removeDuplicates(int* nums, int numsSize) {
if (numsSize == 0) return 0;
int k = 0;
for (int i = 1; i < numsSize; i++) {
if (nums[i] != nums[k]) {
k++;
nums[k] = nums[i];
}
}
return k + 1;
}
int main(int argc, const char * argv[]) {
@autoreleasepool {
int a[] = {0,0,1,1,1,2,2,3,3,4};
int b = removeDuplicates(a, sizeof(a)/sizeof(int));
printf("一共有多少不重復的元素個數%d\n",b);
}
return 0;
}