Loading [MathJax]/jax/output/CommonHTML/config.js
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >2021-06-27:给定一个正数数组arr,代表若干人的体重。再给定一个正数limit,表示所有船共同拥有的载重量。每艘船最多

2021-06-27:给定一个正数数组arr,代表若干人的体重。再给定一个正数limit,表示所有船共同拥有的载重量。每艘船最多

作者头像
福大大架构师每日一题
发布于 2021-08-05 08:13:19
发布于 2021-08-05 08:13:19
40700
代码可运行
举报
运行总次数:0
代码可运行

2021-06-27:给定一个正数数组arr,代表若干人的体重。再给定一个正数limit,表示所有船共同拥有的载重量。每艘船最多坐两人,且不能超过载重,想让所有的人同时过河,并且用最好的分配方法让船尽量少。返回最少的船数。

福大大 答案2021-06-27:

数组是[1 3 5 5 5 7 9 2 4 6 8 10],limit是10。

1.排序。[1 3 5 5 5 7 9 2 4 6 8 10]排序后是[1 2 3 4 5 5 5 6 7 8 9 10]。

2.找到小于等于limit/2位置,,此时位置是6。

3.准备双指针,左指针指向6位置,右指针指向7位置。左右指针之和大于limit,左指针左移;左右指针之和小于limit,右指针右移;左右指针之和等于limit,左指针左移,右指针右移。

4.统计计数。左右能配对者,左右两个数计为1;不能配对者,左边每两个数计为1,右边1个数计为1。最后全部相加,就是需要返回的值。

时间复杂度:O(N)。额外空间复杂度:O(1)。

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

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
package main

import (
    "fmt"
    "sort"
)

func main() {
    arr := []int{1, 3, 5, 5, 5, 7, 9, 2, 4, 6, 8, 10}
    fmt.Println(arr)
    ret := minBoat(arr, 10)
    fmt.Println(ret)
}

func minBoat(arr []int, limit int) int {
    if len(arr) == 0 {
        return 0
    }
    N := len(arr)
    sort.Ints(arr)
    fmt.Println(arr)
    if arr[N-1] > limit {
        return -1
    }
    lessR := -1
    for i := N - 1; i >= 0; i-- {
        if arr[i] <= (limit / 2) {
            lessR = i
            break
        }
    }
    if lessR == -1 {
        return N
    }
    L := lessR
    R := lessR + 1
    noUsed := 0
    for L >= 0 {
        solved := 0
        for R < N && arr[L]+arr[R] <= limit {
            R++
            solved++
        }
        if solved == 0 {
            noUsed++
            L--
        } else {
            L = getMax(-1, L-solved)
        }
    }
    all := lessR + 1
    used := all - noUsed
    moreUnsolved := (N - all) - used
    return used + ((noUsed + 1) >> 1) + moreUnsolved
}

func getMax(a int, b int) int {
    if a > b {
        return a
    } else {
        return b
    }
}

执行结果如下:

***

[左神java代码](https://github.com/algorithmzuo/coding-for-great-offer/blob/main/src/class03/Code05_MinBoat.java)

本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2021-06-27,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 福大大架构师每日一题 微信公众号,前往查看

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

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
暂无评论
推荐阅读
编辑精选文章
换一批
2021-12-01:给定一个正数数组arr,代表每个人的体重。给
2021-12-01:给定一个正数数组arr,代表每个人的体重。给定一个正数limit代表船的载重,所有船都是同样的载重量。
福大大架构师每日一题
2021/12/01
2520
2022-04-11:给定一个正数数组arr,其中每个值代表砖块长度
2022-04-11:给定一个正数数组arr,其中每个值代表砖块长度, 所有砖块等高等宽,只有长度有区别, 每一层可以用1块或者2块砖来摆, 要求每一层的长度一样, 要求必须使用所有的砖块, 请问最多摆几层。 来自华为。 答案2022-04-11: 双指针,先排序。 情况一:最大的单独一层。 情况二:最大的需要组合。 代码用golang编写。代码如下: package main import ( "fmt" "sort" ) func main() { arr := []int{50, 50, 1
福大大架构师每日一题
2022/04/11
3140
2021-05-24:盛最多水的容器。给你 n 个非负整数 a1,a2,...,an,每个数代表坐标中的一个点 (i, ai)
2021-05-24:盛最多水的容器。给你 n 个非负整数 a1,a2,...,an,每个数代表坐标中的一个点 (i, ai) 。在坐标内画 n 条垂直线,垂直线 i 的两个端点分别为 (i, ai) 和 (i, 0) 。找出其中的两条线,使得它们与 x 轴共同构成的容器可以容纳最多的水。
福大大架构师每日一题
2021/08/05
5640
2021-05-21:给定一个数组arr,先递减然后递增,返回arr中有
2021-05-21:给定一个数组arr,先递减然后递增,返回arr中有多少个绝对值不同的数字?
福大大架构师每日一题
2021/05/21
6130
2021-05-21:给定一个数组arr,先递减然后递增,返回arr中有
2021-11-22:给定一个正数数组arr,表示每个小朋友的得
任何两个相邻的小朋友,如果得分一样,怎么分糖果无所谓,但如果得分不一样,分数大的一定要比分数少的多拿一些糖果;
福大大架构师每日一题
2021/11/22
2190
2021-04-04:给定一个非负数组arr,和一个正数m的最大值。
2021-04-04:给定一个非负数组arr,和一个正数m。 返回arr的所有子序列中累加和%m之后的最大值。
福大大架构师每日一题
2021/04/04
9500
2021-04-04:给定一个非负数组arr,和一个正数m的最大值。
2021-05-24:盛最多水的容器。给你 n 个非负整数 a1,a2,...,an
2021-05-24:盛最多水的容器。给你 n 个非负整数 a1,a2,...,an,每个数代表坐标中的一个点 (i, ai) 。在坐标内画 n 条垂直线,垂直线 i 的两个端点分别为 (i, ai) 和 (i, 0) 。找出其中的两条线,使得它们与 x 轴共同构成的容器可以容纳最多的水。
福大大架构师每日一题
2021/05/24
6000
2021-05-24:盛最多水的容器。给你 n 个非负整数 a1,a2,...,an
2021-05-01:给定一个有序数组arr,代表坐落在X轴上的点。给定一个正数K
2021-05-01:给定一个有序数组arr,代表坐落在X轴上的点。给定一个正数K,代表绳子的长度。返回绳子最多压中几个点?即使绳子边缘处盖住点也算盖住。
福大大架构师每日一题
2021/05/04
5070
2021-05-01:给定一个有序数组arr,代表坐落在X轴上的点。给定一个正数K
2021-02-25:给定一个正数数组arr,请把arr中所有的数分成两个集合。
2021-02-25:给定一个正数数组arr,请把arr中所有的数分成两个集合。如果arr长度为偶数,两个集合包含数的个数要一样多;如果arr长度为奇数,两个集合包含数的个数必须只差一个。请尽量让两个集合的累加和接近,返回最接近的情况下,较小集合的累加和。
福大大架构师每日一题
2021/02/25
3260
2021-02-25:给定一个正数数组arr,请把arr中所有的数分成两个集合。
2021-03-31:给定一个数组arr,给定一个值v。求子数组平均值小于等于v
2021-03-31:给定一个数组arr,给定一个值v。求子数组平均值小于等于v的最长子数组长度。
福大大架构师每日一题
2021/03/31
3210
2021-03-31:给定一个数组arr,给定一个值v。求子数组平均值小于等于v
2021-11-27:给定一个数组arr,长度为N,做出一个结构,
2021-11-27:给定一个数组arr,长度为N,做出一个结构,可以高效的做如下的查询:
福大大架构师每日一题
2021/11/27
2510
2021-04-25:给定一个数组arr,和一个正数M,返回在
福大大 答案2021-04-25: 前缀和+左大右小的双端队列。时间太晚了,所以写得简单。 代码用golang编写。代码如下: package main import ( "container/list" "fmt" ) func main() { arr := []int{1, 2, -3, 4, -5} ret := maxSum(arr, 5) fmt.Println(ret) } // O(N)的解法,最优解 func maxSum(arr []int,
福大大架构师每日一题
2021/05/04
4100
2021-04-25:给定一个数组arr,和一个正数M,返回在
2021-02-15:给定一个整型数组arr,代表数值不同的纸牌排成一条线。,
2021-02-15:给定一个整型数组arr,代表数值不同的纸牌排成一条线。玩家A和玩家B依次拿走每张纸牌,规定玩家A先拿,玩家B后拿。但是每个玩家每次只能拿走最左或最右的纸牌,玩家A和玩家B都绝顶聪明。请返回最后获胜者的分数。
福大大架构师每日一题
2021/02/15
4530
2021-02-15:给定一个整型数组arr,代表数值不同的纸牌排成一条线。,
2022-01-11:给定一个正数数组arr长度为n、正数x、正数y
2022-01-11:给定一个正数数组arr长度为n、正数x、正数y。 你的目标是让arr整体的累加和<=0, 你可以对数组中的数num执行以下三种操作中的一种,且每个数最多能执行一次操作 : 1.不变; 2.可以选择让num变成0,承担x的代价; 3.可以选择让num变成-num,承担y的代价。 返回你达到目标的最小代价。 数据规模 : 面试时面试官没有说数据规模。 来自微软面试。 答案2022-01-11: 贪心。从大到小排序。 x>=y时,就只执行y操作,没有x操作。 x<y时,先执行y操作,再执行
福大大架构师每日一题
2022/01/11
4400
2021-07-14:接雨水。给定 n 个非负整数表示每个宽度为 1
2021-07-14:接雨水。给定 n 个非负整数表示每个宽度为 1 的柱子的高度图,计算按此排列的柱子,下雨之后能接多少雨水。
福大大架构师每日一题
2021/07/14
4880
2021-07-14:接雨水。给定 n 个非负整数表示每个宽度为 1
2021-04-29:给定一个数组 arr,代表一排有分数的气球。每打爆一
2021-04-29:给定一个数组 arr,代表一排有分数的气球。每打爆一个气球都能获得分数,假设打爆气 球 的分数为 X,获得分数的规则如下: 1)如果被打爆气球的左边有没被打爆的气球,找到离被打爆气球最近的气球,假设分数为 L;如果被打爆气球的右边有没被打爆的气球,找到离被打爆气球最近的气球,假设分数为 R。 获得分数为 L_X_R。 2)如果被打爆气球的左边有没被打爆的气球,找到离被打爆气球最近的气球,假设分数为 L;如果被打爆气球的右边所有气球都已经被打爆。获得分数为 L_X。 3)如果被打爆气球的左边所有的气球都已经被打爆;如果被打爆气球的右边有没被打爆的 气球,找到离被打爆气球最近的气球,假设分数为 R;如果被打爆气球的右边所有气球都 已经 被打爆。获得分数为 X_R。 4)如果被打爆气球的左边和右边所有的气球都已经被打爆。获得分数为 X。目标是打爆所有气球,获得每次打爆的分数。通过选择打爆气球的顺序,可以得到不同的总分,请返回能获得的最大分数。【举例】arr = {3,2,5} 如果先打爆3,获得3_2;再打爆2,获得2_5;最后打爆5,获得5;最后总分21 如果先打爆3,获得3_2;再打爆5,获得2_5;最后打爆2,获得2;最后总分18 如果先打爆2,获得3_2_5;再打爆3,获得3_5;最后打爆5,获得5;最后总分50 如果先打爆2,获得3_2_5;再打爆5,获得3_5;最后打爆3,获得3;最后总分48 如果先打爆5,获得2_5;再打爆3,获得3_2;最后打爆2,获得2;最后总分18 如果先打爆5,获得2_5;再打爆2,获得3_2;最后打爆3,获得3;最后总分19 返回能获得的最大分数为50。
福大大架构师每日一题
2021/05/04
3450
2021-04-29:给定一个数组 arr,代表一排有分数的气球。每打爆一
2021-06-18:已知数组arr,生成一个数组out,out的每个元素必须大于等于1
2021-06-18:已知数组arr,生成一个数组out,out的每个元素必须大于等于1,当arr[cur]>arr[cur-1]时,out[cur]>out[cur-1];当arr[cur]>arr[cur+1]时,out[cur]>out[cur+1]。求最小out的元素之和。比如[2,3,5,5,4],生成数组是[1,2,3,2,1],和是9。
福大大架构师每日一题
2021/06/18
6270
2021-06-18:已知数组arr,生成一个数组out,out的每个元素必须大于等于1
​2021-03-23:给定一个正整数组成的无序数组arr,给定一个正整数值K
2021-03-23:给定一个正整数组成的无序数组arr,给定一个正整数值K,找到arr的所有子数组里,哪个子数组的累加和等于K并且是长度最大的。返回其长度。
福大大架构师每日一题
2021/03/23
5140
​2021-03-23:给定一个正整数组成的无序数组arr,给定一个正整数值K
2021-05-08:给定两个非负数组x和hp,长度都是N,再给定一个正数range
2021-05-08:给定两个非负数组x和hp,长度都是N,再给定一个正数range。x有序,xi表示i号怪兽在x轴上的位置;hpi表示i号怪兽的血量 。range表示法师如果站在x位置,用AOE技能打到的范围是: x-range,x+range,被打到的每只怪兽损失1点血量 。返回要把所有怪兽血量清空,至少需要释放多少次AOE技能?
福大大架构师每日一题
2021/05/10
5400
2021-05-08:给定两个非负数组x和hp,长度都是N,再给定一个正数range
2021-08-10:给定一个正数数组arr,返回arr的子集不能累加
2021-08-10:给定一个正数数组arr,返回arr的子集不能累加出的最小正数。1)正常怎么做? 2)如果arr中肯定有1这个值,怎么做?
福大大架构师每日一题
2021/08/10
3960
2021-08-10:给定一个正数数组arr,返回arr的子集不能累加
推荐阅读
2021-12-01:给定一个正数数组arr,代表每个人的体重。给
2520
2022-04-11:给定一个正数数组arr,其中每个值代表砖块长度
3140
2021-05-24:盛最多水的容器。给你 n 个非负整数 a1,a2,...,an,每个数代表坐标中的一个点 (i, ai)
5640
2021-05-21:给定一个数组arr,先递减然后递增,返回arr中有
6130
2021-11-22:给定一个正数数组arr,表示每个小朋友的得
2190
2021-04-04:给定一个非负数组arr,和一个正数m的最大值。
9500
2021-05-24:盛最多水的容器。给你 n 个非负整数 a1,a2,...,an
6000
2021-05-01:给定一个有序数组arr,代表坐落在X轴上的点。给定一个正数K
5070
2021-02-25:给定一个正数数组arr,请把arr中所有的数分成两个集合。
3260
2021-03-31:给定一个数组arr,给定一个值v。求子数组平均值小于等于v
3210
2021-11-27:给定一个数组arr,长度为N,做出一个结构,
2510
2021-04-25:给定一个数组arr,和一个正数M,返回在
4100
2021-02-15:给定一个整型数组arr,代表数值不同的纸牌排成一条线。,
4530
2022-01-11:给定一个正数数组arr长度为n、正数x、正数y
4400
2021-07-14:接雨水。给定 n 个非负整数表示每个宽度为 1
4880
2021-04-29:给定一个数组 arr,代表一排有分数的气球。每打爆一
3450
2021-06-18:已知数组arr,生成一个数组out,out的每个元素必须大于等于1
6270
​2021-03-23:给定一个正整数组成的无序数组arr,给定一个正整数值K
5140
2021-05-08:给定两个非负数组x和hp,长度都是N,再给定一个正数range
5400
2021-08-10:给定一个正数数组arr,返回arr的子集不能累加
3960
相关推荐
2021-12-01:给定一个正数数组arr,代表每个人的体重。给
更多 >
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档