牛客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;
    }
};
相关推荐
希望有朝一日能如愿以偿32 分钟前
力扣题解(飞机座位分配概率)
算法·leetcode·职场和发展
丶Darling.43 分钟前
代码随想录 | Day26 | 二叉树:二叉搜索树中的插入操作&&删除二叉搜索树中的节点&&修剪二叉搜索树
开发语言·数据结构·c++·笔记·学习·算法
JustCouvrir1 小时前
代码随想录算法训练营Day15
算法
小小工匠1 小时前
加密与安全_HOTP一次性密码生成算法
算法·安全·htop·一次性密码
中文英文-我选中文1 小时前
排序算法的理解
算法·排序算法
我明天再来学Web渗透2 小时前
【hot100-java】【二叉树的层序遍历】
java·开发语言·数据库·sql·算法·排序算法
数据分析螺丝钉2 小时前
力扣第240题“搜索二维矩阵 II”
经验分享·python·算法·leetcode·面试
no_play_no_games2 小时前
「3.3」虫洞 Wormholes
数据结构·c++·算法·图论
五味香2 小时前
C++学习,信号处理
android·c语言·开发语言·c++·学习·算法·信号处理
毕小宝3 小时前
逻辑回归(下): Sigmoid 函数的发展历史
算法·机器学习·逻辑回归