面试题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
}


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值