牛客NC382 切割木头【中等 二分超找 Java/Go/C++】

题目

题目链接:

https://www.nowcoder.com/practice/707d98cee255448c838c76918a702be0

核心

 二分查找

Java代码

java 复制代码
import java.util.*;


public class Solution {
    /**
     * 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可
     *
     *
     * @param a int整型一维数组
     * @param k int整型
     * @return int整型
     */
    public int cutWood (ArrayList<Integer> ll, int k) {
        if (ll == null || ll.size() == 0) return 0;
        int[] a = new int[ll.size()];
        for(int i=0;i<ll.size();i++){
            a[i] = ll.get(i);
        }
        int L = 1; //数据合法的情况下,长度为1的是最多
        int R = 0;
        long total = 0;
        for (int i : a) {
            total += i;
            R = Math.max(R, i);
        }

        if (total < k) return 0;

        while (L < R) {
            int m = L + (R - L + 1) / 2;
            long cur = binarySearch(a, m);
            if (cur < k) {
                R = m - 1;
            } else {
                L = m;
            }
        }

        return L;
    }
    public long binarySearch(int[] arr, int m) {
        long cnt = 0;
        for (int i : arr) {
            cnt += i / m;
        }
        return cnt;
    }
}

Go代码

go 复制代码
package main

/**
 * 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可
 *
 *
 * @param a int整型一维数组
 * @param k int整型
 * @return int整型
 */
func cutWood(a []int, k int) int {
	if a == nil || len(a) == 0 {
		return 0
	}

	L := 1 //数据合法的情况下,长度为1的时候是能切最多数量的
	R := 0
	total := 0
	for _, t := range a {
		total += t
		if t > R {
			R = t
		}
	}

	if total < k {
		return 0 //数据不合法
	}

	for L < R {
		m := L + (R-L+1)/2
		cur := binarySearch(a, m)

		if cur < k {
			R = m - 1
		} else {
			L = m
		}
	}
	return L
}

func binarySearch(arr []int, m int) int {
	cnt := 0
	for _, t := range arr {
		cnt += t / m
	}
	return cnt
}

C++代码

cpp 复制代码
class Solution {
  public:
    /**
     * 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可
     *
     *
     * @param a int整型vector
     * @param k int整型
     * @return int整型
     */
    int cutWood(vector<int>& a, int k) {
        if (a.size() == 0)
            return 0;

        int L = 1; //数据合法的情况下,长度为1能切到最多数量的k【假设k是变动的】
        int R = 0;
        int total = 0;

        for (int i = 0; i < a.size(); i++) {
            int cur = a[i];
            total += cur;
            if (cur > R) {
                R = cur;
            }
        }

        while (L < R) {
            int m = L + (R - L + 1) / 2;
            int cur = binarySearch(a, m);
            if (cur < k) {
                R = m - 1;
            } else {
                L = m;
            }
        }
        return L;
    }

    int binarySearch(vector<int>& arr, int m) {
        int cnt = 0;
        for (int i = 0; i < arr.size(); i++) {
            cnt += arr[i] / m;
        }
        return cnt;
    }
};
相关推荐
小码农<^_^>16 分钟前
优选算法精品课--滑动窗口算法(一)
算法
羊小猪~~18 分钟前
神经网络基础--什么是正向传播??什么是方向传播??
人工智能·pytorch·python·深度学习·神经网络·算法·机器学习
软工菜鸡44 分钟前
预训练语言模型BERT——PaddleNLP中的预训练模型
大数据·人工智能·深度学习·算法·语言模型·自然语言处理·bert
南宫生1 小时前
贪心算法习题其三【力扣】【算法学习day.20】
java·数据结构·学习·算法·leetcode·贪心算法
AI视觉网奇1 小时前
sklearn 安装使用笔记
人工智能·算法·sklearn
JingHongB2 小时前
代码随想录算法训练营Day55 | 图论理论基础、深度优先搜索理论基础、卡玛网 98.所有可达路径、797. 所有可能的路径、广度优先搜索理论基础
算法·深度优先·图论
weixin_432702262 小时前
代码随想录算法训练营第五十五天|图论理论基础
数据结构·python·算法·深度优先·图论
小冉在学习2 小时前
day52 图论章节刷题Part04(110.字符串接龙、105.有向图的完全可达性、106.岛屿的周长 )
算法·深度优先·图论
Repeat7152 小时前
图论基础--孤岛系列
算法·深度优先·广度优先·图论基础
小冉在学习2 小时前
day53 图论章节刷题Part05(并查集理论基础、寻找存在的路径)
java·算法·图论