442. 数组中重复的数据
题目描述:
给你一个长度为 n 的整数数组 nums ,其中 nums 的所有整数都在范围 [1, n] 内,且每个整数出现 一次 或 两次 。请你找出所有出现 两次 的整数,并以数组形式返回。
你必须设计并实现一个时间复杂度为 O(n) 且仅使用常量额外空间的算法解决此问题。
题解:
func findDuplicates(nums []int) []int {
// 先排序,时间复杂度为O(n)
sort.Ints(nums)
// 准备一个指针,下面用到
count := 0
for count < len(nums) {
// 当计数器来到最后一个元素,直接移除即可(这里不懂的话,结合下面的if理解)
// 如果最后一个元素存在重复,那么肯定在上一个元素的时候就进入了下面的else,count肯定指向最后一个元素的
// 所以只要count来到最后一位,那么一定是单独的元素。
if count == len(nums)-1 {
nums = nums[0:count]
break
}
// 因为 nums 中的每个元素出现 一次 或 两次
// 所以排序后,若下一个元素不等于自己,说明自己是单独的,直接移除
if nums[count] != nums[count+1] {
nums = append(nums[0:count], nums[count+1:]...)
} else { // 而如果下一个等于自己,说明自己是有重复的,移除一个,留下一个,计数器+1,
nums = append(nums[0:count], nums[count+1:]...)
count = count + 1
}
}
return nums
}