左、右指针一般运用在数组或者字符串中,实际是指两个索引值,一般初始化为 left=0,right = len(nums)-1。
1. 二分搜索
func binarySearch(a []int, target int) int {
left := 0
right := len(a) - 1
// 因为搜素区间是 [left, right],左右都是封闭的,所以循环时应该是 <=
for left <= right {
mid := left + (right-left)/2
if a[mid] == target {
return mid
} else if a[mid] < target {
left = mid + 1
} else if a[mid] > target {
right = mid - 1
}
}
return -1
}
2. 两数之和
一个已按照升序排列的有序数组 nums 和一个目标值 target ,在 nums 中找到两个数使得它们相加之和等于 target ,请返回这两个数字的索引。比如输入 [2,7,11,15],target = 13 ,返回结果 [0,2]。
func findIndex(a []int, target int) []int {
left := 0
right := len(a) - 1
indexSlice := make([]int, 0)
for left <= right {
sum := a[left] + a[right]
if sum > target {
right-- // 让 sum 结果变小些
} else if sum < target {
left++ // 让 sum 结果变大些
} else if sum == target {
indexSlice = append(indexSlice, left, right)
return indexSlice
}
}
return nil
}
func main() {
arr := []int{2, 3, 4, 5, 6, 9, 11, 15}
fmt.Println(findIndex(arr, 31))
}
3. 翻转数组
func reverse(a []int) []int {
left := 0
right := len(a) - 1
for left <= right {
temp := a[left]
a[left] = a[right]
a[right] = temp
left++
right--
}
return a
}
func main() {
arr := []int{2, 3, 4, 5, 6, 9, 11, 15}
fmt.Println(reverse(arr))
}
4. 调整数组顺序使奇数位于偶数前面
输入一个整数数组,实现一个函数来调整该数组中数字的顺序,使得所有奇数在数组的前半部分,所有偶数在数组的后半部分。
输入:nums = [1,2,3,4]
输出:[1,3,2,4]
注:[3,1,2,4] 也是正确的答案之一。
func exchange(nums []int) []int {
left := 0
right := len(nums) - 1
for left <= right {
// 左指针找偶数
if nums[left] & 1 == 1 {
left++
// 右指针找奇数
}else if nums[right] & 1 == 0 {
right--
// 如果左指针为偶数,右指针为奇数,那么交换位置
}else if nums[left] & 1 == 0 && nums[right] & 1 == 1 {
temp := nums[left]
nums[left] = nums[right]
nums[right] = temp
left++
right--
}
}
return nums
}