219.存在重复元素 II

65 阅读1分钟

题目:
给你一个整数数组 nums 和一个整数 k ,判断数组中是否存在两个 不同的索引 **i 和 **j ,满足 nums[i] == nums[j] 且 abs(i - j) <= k 。如果存在,返回 true ;否则,返回 false 。
解法:
方法1:暴力法:

func containsNearbyDuplicate(nums []int, k int) bool {
	existMap := make(map[int][]int)// val:index
	for i := range nums {
		if indexs, ok := existMap[nums[i]]; ok {
			for j := range indexs {
				if abs(i, indexs[j]) <= k {
					return true
				}
			}
			existMap[nums[i]] = append(existMap[nums[i]], i)
		} else {
			existMap[nums[i]] = []int{i}
		}
	}
	return false
}

func abs(a, b int) int{
	if a > b {
		return a - b
	}
	return b - a
}

方法二:滑动窗口

func containsNearbyDuplicate(nums []int, k int) bool {
	slideMap := make(map[int]bool)
	for i := range nums {
		if i > k {
			delete(slideMap, nums[i - k - 1])
		} 
			
		if _, ok := slideMap[nums[i]]; ok {
			return true
		} else {
			slideMap[nums[i]] = true
		}
		

		
	}
	return false
}