目标:给定目标值,得出(顺序/非顺序)切片两元素和为目标值的两个下标
// 0 1 2 3 4 5 6 7
s := []int{1, 2, 4, 3, 5, 6, 7, 8}
t := 15
var res [][]int
for i := 0; i < len(s); i++ {
for j := i + 1; j < len(s); j++ {
if s[i]+s[j] == t {
res = append(res, []int{i, j})
}
}
}
fmt.Println(res) // [[1 7] [2 5] [3 6]]
- 嵌套循环不解释
var res2 [][]int
t := 10
s2 := []int{1, 2, 3, 4, 5, 6, 8}
f, l := 0, len(s2)-1
for {
sun := s2[f] + s2[l]
if sun == t {
if sun == t {
if f != l {
res2 = append(res2, []int{f, l})
}
f++
}
}
if sun < t {
f++
}
if sun > t {
l--
}
if f > l {
break
}
}
fmt.Println(res2) // [[1 6] [3 5]]
- 双指针即:从头部与尾部同时进行,当两个下标的和小于目标值时,头部
‘指针’
向右移动,当两个下标和大于目标值时,尾部‘指针’
向左移动,直到两个'指针'
重合循环结束,可以看出,如果是乱序就没什么用处了
- 相比于方案1,方案2只需要遍历len(slice)/2次,但是需要顺序保证。