Leetcode Note: Go - Remove Duplicates From Sorted Array
Remove Duplicates from Sorted Array - LeetCode
https://leetcode.com/problems/remove-duplicates-from-sorted-array/
- Go 言語で取り組んだメモ
所感
- 渡された配列をループして、登場した数値をフラグ管理しつつ、初登場の値である場合だけをカウントしていけば良さそう
実装準備
func removeDuplicates(nums []int) int {
return 0
}
func main() {
// input := []int{1,1,2} // 2
input := []int{0,0,1,1,1,2,2,3,3,4} // 5
fmt.Println(input)
output := removeDuplicates(input)
fmt.Println(output)
}
v1 実装
func removeDuplicates(nums []int) int {
count := 0
m := map[int]bool{}
for i := 0; i < len(nums); i++ {
if _, ok := m[nums[i]]; ok == false {
count++
m[nums[i]] = true
}
}
return count
}
func main() {
// input := []int{1,1,2} // 2
input := []int{0,0,1,1,1,2,2,3,3,4} // 5
fmt.Println(input)
output := removeDuplicates(input)
fmt.Println(output)
}
- これでユニークな数値をカウントすることは出来るようになった
- が、問題を読み違えてた・・・
- 重複を排除した数値を return する必要がある
[1, 1, 2]
なら[1, 1]
[0, 0, 1, 1, 1, 2, 2, 3, 3, 4]
なら[0, 1, 2, 3, 4]
- しかし
removeDuplicates
の戻り値は int が指定されている・・・- どう return すれば良いんだろう・・・?
回答
Simple O(n) solution with explanation in Go - LeetCode Discuss
https://leetcode.com/problems/remove-duplicates-from-sorted-array/discuss/942382/Simple-O(n)-solution-with-explanation-in-Go
- 2つ のポインタを使う
- fast => 1
- slow => 0
- fast が配列の最後に到達していない間に index fast と slow の要素が同じか確認する
- 同じ場合は fast を 1桁 動かす
- 同じではない場合は 重複していない要素を slow の後ろにコピーする
fast が配列の最後に到達すると、すべて一意の要素が slow 配列 に格納される
func removeDuplicates(nums []int) int { if len(nums) <= 1 { return 1 } slow := 0 fast := 1 n := len(nums) for fast < n { if nums[fast] == nums[slow] { fast++ } else { slow++ nums[slow] = nums[fast] } } return slow + 1 }
そもそも問題文の Custom Judge に、どういう方法で回答を判定するかのロジックが記載されてた・・・
1 以上の長さで、ソート済みの数値配列が渡されるので、配列要素の前後を比較して重複を判定し、ユニークな要素数を return すれば良い
英語でも問題文はちゃんと読みましょう・・・