在数组中找到一个在线性时间内比任何其他数组大两倍的数字
Find a number in an array that is twice as big as any other in linear time
我的任务是改进我的算法,找到一个比数组中任何其他数字大两倍的数字。它目前在 O(n^2) 中 运行s,我需要在 O(n) 中使其成为 运行。
func twiceAsOldExact(p []person) bool {
for i := 0; i < len(p); i++ {
for j := 0; j < len(p); j++ {
if j == i {
continue
}
if p[i].age == 2*p[j].age {
return true
}
}
}
return false
}
我考虑过使用计数排序对数组进行排序并从那里开始工作,但是我不确定这是否可行。
说我有这个数组a := []int{4,5,12,24}
算法应该 return 正确,因为 24 是 12 的两倍。
如果数组是 a := []int{4,8,10,16}
它会 return 为真,因为 8 是 4 的两倍大,或者 16 是 8 的两倍,这取决于首先完成检查的内容。
你们中的任何人对我应该如何解决这个问题有任何指示吗?部分解决方案很好,或者只是建议,因为它是为了面试,也许寻求外部帮助是不道德的(尽管那是我在工作中会做的)。
此致!
建议的解决方案
func twiceAsOldExact2(p []person) bool {
m := make(map[int]int)
for i := 0; i < len(p); i++ {
m[p[i].age] = i
}
for i := 0; i < len(p); i++ {
if _, ok := m[2*p[i].age]; ok {
return true
}
}
return false
}
将值放入地图,并针对每个值 x
检查地图中是否存在 2*x
。
插入映射(实现为哈希表)和搜索平均每个操作需要 O(1),因此映射方法接近线性 O(n),并且比二次 O(n^2) 快得多two-loops一个(但占用内存)
将您的数组复制到哈希 table,然后在该哈希table 中搜索 2x。全部是 O(N),因为有 N 个元素,而哈希 table 插入和搜索是 O(1).
我的任务是改进我的算法,找到一个比数组中任何其他数字大两倍的数字。它目前在 O(n^2) 中 运行s,我需要在 O(n) 中使其成为 运行。
func twiceAsOldExact(p []person) bool {
for i := 0; i < len(p); i++ {
for j := 0; j < len(p); j++ {
if j == i {
continue
}
if p[i].age == 2*p[j].age {
return true
}
}
}
return false
}
我考虑过使用计数排序对数组进行排序并从那里开始工作,但是我不确定这是否可行。
说我有这个数组a := []int{4,5,12,24}
算法应该 return 正确,因为 24 是 12 的两倍。
如果数组是 a := []int{4,8,10,16}
它会 return 为真,因为 8 是 4 的两倍大,或者 16 是 8 的两倍,这取决于首先完成检查的内容。
你们中的任何人对我应该如何解决这个问题有任何指示吗?部分解决方案很好,或者只是建议,因为它是为了面试,也许寻求外部帮助是不道德的(尽管那是我在工作中会做的)。
此致!
建议的解决方案
func twiceAsOldExact2(p []person) bool {
m := make(map[int]int)
for i := 0; i < len(p); i++ {
m[p[i].age] = i
}
for i := 0; i < len(p); i++ {
if _, ok := m[2*p[i].age]; ok {
return true
}
}
return false
}
将值放入地图,并针对每个值 x
检查地图中是否存在 2*x
。
插入映射(实现为哈希表)和搜索平均每个操作需要 O(1),因此映射方法接近线性 O(n),并且比二次 O(n^2) 快得多two-loops一个(但占用内存)
将您的数组复制到哈希 table,然后在该哈希table 中搜索 2x。全部是 O(N),因为有 N 个元素,而哈希 table 插入和搜索是 O(1).