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 }
提交结果: