golang力扣leetcode 287.寻找重复数

287.寻找重复数

题解

题目:给一个数组,元素大小1~n,其中有一个数出现两次,要求用O(1)的空间复杂度求出这个出现两次的元素,并且不能修改原数组

思路:

快慢指针

取巧

1.取出一个数,将其对应的下标上的数变号
2.如果遇到已经变号的数,说明之前被变号了,既然是1~n,说明现在遍历的这个数肯定是重复的
3.将原数组都回正
4.其实这种方法,感觉不满足“不能修改原数组”这个要求,擦边了,还是用第一种吧

代码

func findDuplicate(nums []int) int {
          
   
	fast, slow := 0, 0
	for {
          
   
		fast = nums[nums[fast]]
		slow = nums[slow]
		if fast == slow {
          
   
			fast = 0
			for fast != slow {
          
   
				fast = nums[fast]
				slow = nums[slow]
			}
			return slow
		}
	}
	return 0
}
func findDuplicate(nums []int) int {
          
   
	n := len(nums)
	ans := 0
	for i := 0; i < n; i++ {
          
   
		v := abs(nums[i])
		if nums[v-1] > 0 {
          
   
			nums[v-1] *= -1
		} else {
          
   
			ans = v
		}
	}
	for i := 0; i < n; i++ {
          
   
		if nums[i] < 0 {
          
   
			nums[i] *= -1
		}
	}
	return ans
}
func abs(i int) int {
          
   
	if i < 0 {
          
   
		return -i
	}
	return i
}
经验分享 程序员 微信小程序 职场和发展