题目:给定一个整型数组,能否找到找出其中的两个数使其和为某个指定的值?(这个数组是无序的)
直接实现(暴力解决):
// 暴力破解,O(n^2)的时间复杂度
func hasSum(arr []int, target int) bool {
length := len(arr)
for i := 0;i < length;i += 1 {
for j := i + 1;j < length;j += 1 {
if arr[i] + arr[j] == target {
return true
}
}
}
return false
}
书中给出的核心思想是:先将无序的进行排序(从小到大),然后首尾两端分别移动,直到两指针相等,设首指针i,尾指针j,数组A,值为s,结束条件是i == j。如果A[i]+A[j]<s,则i加1,如果A[i]+A[j]=1,返回true,否则减去1。
通过排序,可以将时间复杂度减到O(nlogn)
代码实现如下:
import (
"sort"
)
func hasSum(arr []int, target int) bool {
sort.Ints(arr)
i, j := 0, len(arr) - 1
for i != j {
if arr[i] + arr[j] < target {
i += 1
} else if arr[i] + arr[j] > target {
j -= 1
} else {
return true
}
}
return false
}