# 26. Remove Duplicates from Sorted Array
Given an integer array nums sorted in non-decreasing order, remove the duplicates in-place such that each unique element appears only once. The relative order of the elements should be kept the same.
題目說明將一個已排序非遞減的陣列中所有的重複數字刪除,讓陣列裡的數字只出現一次,相對順序不得改變,之後放入前K個並回傳k值。
並且要求O(1)。
所以這邊必須使用一種演算法來解決in-place algorithm(原/就地演算法)
## In-place algorithm
基本上不需要藉助額外的資料結構就能對輸入的資料進行變換的演算法。原地演算法只允許占用固定大小的額外空間,其中包含了函式呼叫和指標占用的空間。然而,這種形式有很大的局限性,因為他要求指向長度為 n的陣列只能使用 O(log n)個位元位。而更通用的形式認為,原地意味著演算法在更改輸入內容時不需要額外的空間,但是可以在進行這些操作時使用少量的非固定大小的空間。通常,這部分空間複雜度為 O(log n),不過某些情況下任何滿足 O(n)的複雜度也是允許的。注意空間複雜度在是否將索引長度納入此額外空間方面也是有多種選擇的。常見的考量是將索引的數量或需要的指標數量算到空間複雜度當中的。在這篇文章中,我們所指的整體空間複雜度(DSPACE)將指標長度考慮在內了。因此,分析對應的儲存空間占用會比忽略索引、指標長度的方法多一個 log n 因子。
來自 [WIKI](https://zh.wikipedia.org/zh-tw/原地算法)
所以in-place演算法的時間複雜度會比較高,會使用在一些不需要大量佔用空間的演算法,如硬體受限的地方,利用時間去換取空間,整體效率會較差,使用前務必確認好是否使用這個演算法,使用比較高的時間複雜度去解決這個問題。
## 題解
題目說明有給提示就是使用一個變數(i)來作為目前被比較的值的Index,比對i之後的元素,跳過所有重複值,再利用j遍歷整個陣列,並將j的非重複值放到i+1,然後繼續重複這動作。
```c=
int removeDuplicates(int* nums, int numsSize) {
if (numsSize == 0) return 0;
int i = 0;
for (int j = 1; j < numsSize; j++) {
if (nums[j] != nums[i]) {
i++;
nums[i] = nums[j];
}
}
return i + 1;
}
```
###### tags: `LeetCode`