2021-12-01:给定一个正数数组arr,代表每个人的体重。给定一个正数limit代表船的载重,所有船都是同样的载重量。 每个人的体重都一定不大于船的载重。 要求: 1, 可以1个人单独一搜船;(

Posted 福大大架构师每日一题

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了2021-12-01:给定一个正数数组arr,代表每个人的体重。给定一个正数limit代表船的载重,所有船都是同样的载重量。 每个人的体重都一定不大于船的载重。 要求: 1, 可以1个人单独一搜船;(相关的知识,希望对你有一定的参考价值。

2021-12-01:给定一个正数数组arr,代表每个人的体重。给定一个正数limit代表船的载重,所有船都是同样的载重量。
每个人的体重都一定不大于船的载重。
要求:
1, 可以1个人单独一搜船;
2, 一艘船如果坐2人,两个人的体重相加需要是偶数,且总体重不能超过船的载重;
3, 一艘船最多坐2人。
返回如果想所有人同时坐船,船的最小数量。
来自腾讯。

答案2021-12-01:

先排序,再按奇偶分成两个数组。对两个数组求船数,最后求和。
时间复杂度:排序的。
额外空间复杂度:O(N)。

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

package main

import (
    "fmt"
    "sort"
)

func main() 
    arr := []int1, 2, 3, 4, 5
    ret := minBoat(arr, 5)
    fmt.Println(ret)


func minBoat(arr []int, limit int) int 
    sort.Ints(arr)
    odd := 0
    even := 0
    for _, num := range arr 
        if (num & 1) == 0 
            even++
         else 
            odd++
        
    
    odds := make([]int, odd)
    evens := make([]int, even)
    for i := len(arr) - 1; i >= 0; i-- 
        if (arr[i] & 1) == 0 
            even--
            evens[even] = arr[i]
         else 
            odd--
            odds[odd] = arr[i]
        
    
    return min(odds, limit) + min(evens, limit)


func min(arr []int, limit int) int 
    if len(arr) == 0 
        return 0
    
    N := len(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代码

以上是关于2021-12-01:给定一个正数数组arr,代表每个人的体重。给定一个正数limit代表船的载重,所有船都是同样的载重量。 每个人的体重都一定不大于船的载重。 要求: 1, 可以1个人单独一搜船;(的主要内容,如果未能解决你的问题,请参考以下文章

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

2022-05-20:给定一个正数数组arr,长度为N,依次代表N个任务的难度,给定一个正数k, 你只能从0任务开始,依次处理到N-1号任务结束,就是一定要从左往右处理任务, 只不过,难度差距绝对值不

2021-08-10:给定一个正数数组arr,返回arr的子集不能累加出的最小正数。1)正常怎么做? 2)如果arr中肯定有1这个值,怎么做?

动态规划-换钱最少货币数

2022-01-11:给定一个正数数组arr长度为n正数x正数y。 你的目标是让arr整体的累加和<=0, 你可以对数组中的数num执行以下三种操作中的一种,且每个数最多能执行一次操作 : 1.

换钱最少货币数