面试题1:两数之和 1

题目:给定一个整型数组,能否找到找出其中的两个数使其和为某个指定的值?(这个数组是无序的)

直接实现(暴力解决):

// 暴力破解,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
}


猜你喜欢

转载自blog.csdn.net/qq_35191331/article/details/80206145