非排序数组
应用 struct{}
节俭空间, 指定 cap=len(arr)
防止 map 扩容。记录非反复元素索引 j
,将元素前移,原地去重,只需一遍遍历。
工夫复杂度:O(n)
空间复杂度:O(n)
func removeDuplication_map(arr []string) []string { set := make(map[string]struct{}, len(arr)) j := 0 for _, v := range arr { _, ok := set[v] if ok { continue } set[v] = struct{}{} arr[j] = v j++ } return arr[:j]}
已排序数组
工夫复杂度:O(n)
空间复杂度:O(1)
func removeDuplication_sort(arr []string) []string { length := len(arr) if length == 0 { return arr } j := 0 for i := 1; i < length; i++ { if arr[i] != arr[j] { j++ if j < i { swap(arr, i, j) } } } return arr[:j+1]}func swap(arr []string, a, b int) { arr[a], arr[b] = arr[b], arr[a]}
残缺代码及测试:https://github.com/win5do/pla...
Reference
Idiomatic way to remove duplicates in a slice : golang (reddit.com)
SliceTricks · golang/go Wiki (github.com)