题目:给定一个整型数组,能否找到找出其中的两个数使其和为某个指定的值?(这个数组是无序的)
直接实现(暴力解决):
// 暴力破解,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 }