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
40100
代码可运行
举报
运行总次数: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
2440
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
3010
2021-02-25:给定一个正数数组arr,请把arr中所有的数分成两个集合。
2021-02-25:给定一个正数数组arr,请把arr中所有的数分成两个集合。如果arr长度为偶数,两个集合包含数的个数要一样多;如果arr长度为奇数,两个集合包含数的个数必须只差一个。请尽量让两个集合的累加和接近,返回最接近的情况下,较小集合的累加和。
福大大架构师每日一题
2021/02/25
3190
2021-02-25:给定一个正数数组arr,请把arr中所有的数分成两个集合。
2021-11-22:给定一个正数数组arr,表示每个小朋友的得
任何两个相邻的小朋友,如果得分一样,怎么分糖果无所谓,但如果得分不一样,分数大的一定要比分数少的多拿一些糖果;
福大大架构师每日一题
2021/11/22
2110
​2021-03-30:给定一个整数组成的无序数组arr,值可能正、可能负、可能0。<=K
2021-03-30:给定一个整数组成的无序数组arr,值可能正、可能负、可能0。给定一个整数值K,找到arr的所有子数组里,哪个子数组的累加和<=K,并且是长度最大的。返回其长度。
福大大架构师每日一题
2021/03/30
5230
​2021-03-30:给定一个整数组成的无序数组arr,值可能正、可能负、可能0。<=K
2021-05-21:给定一个数组arr,先递减然后递增,返回arr中有
2021-05-21:给定一个数组arr,先递减然后递增,返回arr中有多少个绝对值不同的数字?
福大大架构师每日一题
2021/05/21
6020
2021-05-21:给定一个数组arr,先递减然后递增,返回arr中有
2021-07-12:缺失的第一个正数。给你一个未排序的整数数组
2021-07-12:缺失的第一个正数。给你一个未排序的整数数组 nums ,请你找出其中没有出现的最小的正整数。请你实现时间复杂度为 O(n) 并且只使用常数级别额外空间的解决方案。比如3,4,5,输出1。比如1,2,3,4,0,输出5。
福大大架构师每日一题
2021/07/12
3610
2021-07-12:缺失的第一个正数。给你一个未排序的整数数组
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
5560
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
3380
2021-04-29:给定一个数组 arr,代表一排有分数的气球。每打爆一
2021-03-31:给定一个数组arr,给定一个值v。求子数组平均值小于等于v
2021-03-31:给定一个数组arr,给定一个值v。求子数组平均值小于等于v的最长子数组长度。
福大大架构师每日一题
2021/03/31
3090
2021-03-31:给定一个数组arr,给定一个值v。求子数组平均值小于等于v
​2021-03-23:给定一个正整数组成的无序数组arr,给定一个正整数值K
2021-03-23:给定一个正整数组成的无序数组arr,给定一个正整数值K,找到arr的所有子数组里,哪个子数组的累加和等于K并且是长度最大的。返回其长度。
福大大架构师每日一题
2021/03/23
5030
​2021-03-23:给定一个正整数组成的无序数组arr,给定一个正整数值K
2021-11-27:给定一个数组arr,长度为N,做出一个结构,
2021-11-27:给定一个数组arr,长度为N,做出一个结构,可以高效的做如下的查询:
福大大架构师每日一题
2021/11/27
2440
2021-10-26:给定一个数组arr,arr[i] = j,表示第i号试题的
2021-10-26:给定一个数组arr,arri = j,表示第i号试题的难度为j。给定一个非负数M。想出一张卷子,对于任何相邻的两道题目,前一题的难度不能超过后一题的难度+M。返回所有可能的卷子种数。
福大大架构师每日一题
2021/10/26
3280
2021-05-01:给定一个有序数组arr,代表坐落在X轴上的点。给定一个正数K
2021-05-01:给定一个有序数组arr,代表坐落在X轴上的点。给定一个正数K,代表绳子的长度。返回绳子最多压中几个点?即使绳子边缘处盖住点也算盖住。
福大大架构师每日一题
2021/05/04
4950
2021-05-01:给定一个有序数组arr,代表坐落在X轴上的点。给定一个正数K
2021-02-15:给定一个整型数组arr,代表数值不同的纸牌排成一条线。,
2021-02-15:给定一个整型数组arr,代表数值不同的纸牌排成一条线。玩家A和玩家B依次拿走每张纸牌,规定玩家A先拿,玩家B后拿。但是每个玩家每次只能拿走最左或最右的纸牌,玩家A和玩家B都绝顶聪明。请返回最后获胜者的分数。
福大大架构师每日一题
2021/02/15
4410
2021-02-15:给定一个整型数组arr,代表数值不同的纸牌排成一条线。,
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
5930
2021-05-24:盛最多水的容器。给你 n 个非负整数 a1,a2,...,an
2021-08-10:给定一个正数数组arr,返回arr的子集不能累加
2021-08-10:给定一个正数数组arr,返回arr的子集不能累加出的最小正数。1)正常怎么做? 2)如果arr中肯定有1这个值,怎么做?
福大大架构师每日一题
2021/08/10
3840
2021-08-10:给定一个正数数组arr,返回arr的子集不能累加
2021-07-14:接雨水。给定 n 个非负整数表示每个宽度为 1
2021-07-14:接雨水。给定 n 个非负整数表示每个宽度为 1 的柱子的高度图,计算按此排列的柱子,下雨之后能接多少雨水。
福大大架构师每日一题
2021/07/14
4610
2021-07-14:接雨水。给定 n 个非负整数表示每个宽度为 1
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
3930
2021-04-25:给定一个数组arr,和一个正数M,返回在
2021-05-12:给定一个数组arr,只能对arr中的一个子数组排
2021-05-12:给定一个数组arr,只能对arr中的一个子数组排序, 但是想让arr整体都有序。返回满足这一设定的子数组中,最短的是多长?
福大大架构师每日一题
2021/05/12
5200
2021-05-12:给定一个数组arr,只能对arr中的一个子数组排
推荐阅读
2021-12-01:给定一个正数数组arr,代表每个人的体重。给
2440
2022-04-11:给定一个正数数组arr,其中每个值代表砖块长度
3010
2021-02-25:给定一个正数数组arr,请把arr中所有的数分成两个集合。
3190
2021-11-22:给定一个正数数组arr,表示每个小朋友的得
2110
​2021-03-30:给定一个整数组成的无序数组arr,值可能正、可能负、可能0。<=K
5230
2021-05-21:给定一个数组arr,先递减然后递增,返回arr中有
6020
2021-07-12:缺失的第一个正数。给你一个未排序的整数数组
3610
2021-05-24:盛最多水的容器。给你 n 个非负整数 a1,a2,...,an,每个数代表坐标中的一个点 (i, ai)
5560
2021-04-29:给定一个数组 arr,代表一排有分数的气球。每打爆一
3380
2021-03-31:给定一个数组arr,给定一个值v。求子数组平均值小于等于v
3090
​2021-03-23:给定一个正整数组成的无序数组arr,给定一个正整数值K
5030
2021-11-27:给定一个数组arr,长度为N,做出一个结构,
2440
2021-10-26:给定一个数组arr,arr[i] = j,表示第i号试题的
3280
2021-05-01:给定一个有序数组arr,代表坐落在X轴上的点。给定一个正数K
4950
2021-02-15:给定一个整型数组arr,代表数值不同的纸牌排成一条线。,
4410
2021-05-24:盛最多水的容器。给你 n 个非负整数 a1,a2,...,an
5930
2021-08-10:给定一个正数数组arr,返回arr的子集不能累加
3840
2021-07-14:接雨水。给定 n 个非负整数表示每个宽度为 1
4610
2021-04-25:给定一个数组arr,和一个正数M,返回在
3930
2021-05-12:给定一个数组arr,只能对arr中的一个子数组排
5200
相关推荐
2021-12-01:给定一个正数数组arr,代表每个人的体重。给
更多 >
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档