2022-04-11:给定一个正数数组arr,其中每个值代表砖块长度, 所有砖块等高等宽,只有长度有区别, 每一层可以用1块或者2块砖来摆, 要求每一层的长度一样, 要求必须使用所有的砖块, 请问最多

2023-07-30,,

2022-04-11:给定一个正数数组arr,其中每个值代表砖块长度
所有砖块等高等宽,只有长度有区别,
每一层可以用1块或者2块砖来摆,
要求每一层的长度一样,
要求必须使用所有的砖块,
请问最多摆几层。
来自华为。

答案2022-04-11:

双指针,先排序。
情况一:最大的单独一层。
情况二:最大的需要组合。

代码用golang编写。代码如下:

package main

import (
"fmt"
"sort"
) func main() {
arr := []int{50, 50, 100}
ret := maxLevels(arr)
fmt.Println(ret)
} func maxLevels(arr []int) int {
if len(arr) == 0 {
return 0
}
n := len(arr)
if n < 2 {
return n
}
sort.Ints(arr)
p1 := levels(arr, arr[n-1])
p2 := levels(arr, arr[n-1]+arr[0])
return getMax(p1, p2)
} // 要求所有砖必须都使用,并且每一层最多两块砖,并且每一层长度都是len
// 返回能摆几层,如果无法做到返回-1
func levels(arr []int, len0 int) int {
ans := 0
L := 0
R := len(arr) - 1
for L <= R {
if arr[R] == len0 {
R--
ans++
} else if L < R && arr[L]+arr[R] == len0 {
L++
R--
ans++
} else {
return -1
}
}
return ans
} func getMax(a, b int) int {
if a > b {
return a
} else {
return b
}
}

执行结果如下:


左神java代码

2022-04-11:给定一个正数数组arr,其中每个值代表砖块长度, 所有砖块等高等宽,只有长度有区别, 每一层可以用1块或者2块砖来摆, 要求每一层的长度一样, 要求必须使用所有的砖块, 请问最多的相关教程结束。

《2022-04-11:给定一个正数数组arr,其中每个值代表砖块长度, 所有砖块等高等宽,只有长度有区别, 每一层可以用1块或者2块砖来摆, 要求每一层的长度一样, 要求必须使用所有的砖块, 请问最多.doc》

下载本文的Word格式文档,以方便收藏与打印。