leetcode之283移动零Golang
我觉得我们需要考虑两种情况:
-
数组中不存在重复元素
-
数组中存在重复元素
当数组中存在重复元素,并且target刚好是这两个元素的和,那么我们的返回结果应该是两个相同元素的下标,甚至如果这样相同的元素有很多个,那么我只需要返回前两个相同的元素就可以了。
本题使用哈希来实现,定义哈希为map[int][]int ,键为数组中元素的值,值为他们的下标,因为相同的元素可能会有多个,所以使用一个数组来存储他们的下标
算法
-
遍历数组,将数组元素的值作为
map的键,将元素的下标存入值中(注意,值是一个[]int的数组) -
第二次遍历数组,遍历到的元素的值为
value-
如果
value==target-value,说明了可以由两个相同的元素相加得到这个target,那么就看map值的那个数组是否长度大于等于2,如果是就直接返回这个数组的前两个元素 -
如果
value!=target-value,说明了两个相同的value不能得到这个target,就只需要map中键target-value对应的值的数组长度大于等于1就可以了,然后返回当前遍历的下标和map中数组的第一个值就可以了
-
func twoSum(nums []int, target int) []int {
numsMap := make(map[int][]int)
for index, value := range nums {
numsMap[value] = append(numsMap[value], index)
}
for index, value := range nums {
// 两个元素相等的情况下,数组nums中必须要有两个元素才行
if value*2 == target {
if len(numsMap[value]) > 1 {
return numsMap[value][:2]
}
} else {
// 连个元素不相等
if len(numsMap[target-value]) > 0 {
return append(numsMap[target-value], index)
}
}
}
return []int{}
}
浙公网安备 33010602011771号