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代码