题目
题目链接:
https://www.nowcoder.com/practice/707d98cee255448c838c76918a702be0
核心
二分查找
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代码
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++代码
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;
}
};