首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >2022-04-11:给定一个正数数组arr,其中每个值代表砖块长度

2022-04-11:给定一个正数数组arr,其中每个值代表砖块长度

原创
作者头像
福大大架构师每日一题
发布2022-04-11 23:11:10
发布2022-04-11 23:11:10
3210
举报

2022-04-11:给定一个正数数组arr,其中每个值代表砖块长度,

所有砖块等高等宽,只有长度有区别,

每一层可以用1块或者2块砖来摆,

要求每一层的长度一样,

要求必须使用所有的砖块,

请问最多摆几层。

来自华为。

答案2022-04-11:

双指针,先排序。

情况一:最大的单独一层。

情况二:最大的需要组合。

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

代码语言:go
复制
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代码

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档