袋子里最小数目的球(java)
问题描述: 给你一个整数数组 nums ,其中 nums[i] 表示第 i 个袋子里球的数目。同时给你一个整数 maxOperations 。 你可以进行如下操作至多 maxOperations 次: 选择任意一个袋子,并将袋子里的球分到 2 个新的袋子中,每个袋子里都有 正整数 个球。 比方说,一个袋子里有 5 个球,你可以把它们分到两个新袋子里,分别有 1 个和 4 个球,或者分别有 2 个和 3 个球。 你的开销是单个袋子里球数目的 最大值 ,你想要 最小化 开销。 请你返回进行上述操作后的最小开销。
样例如下: 代码如下:
import java.util.Arrays; public class MinimumSize { //给你一个整数数组 nums ,其中 nums[i] 表示第 i 个袋子里球的数目。同时给你一个整数 maxOperations 。 //你可以进行如下操作至多 maxOperations 次: //选择任意一个袋子,并将袋子里的球分到 2 个新的袋子中,每个袋子里都有 正整数 个球。 //比方说,一个袋子里有 5 个球,你可以把它们分到两个新袋子里,分别有 1 个和 4 个球,或者分别有 2 个和 3 个球。 //你的开销是单个袋子里球数目的 最大值 ,你想要 最小化 开销。 //请你返回进行上述操作后的最小开销。 public static int minimumSize(int[] nums, int maxOperations) { int left = 1; int right = Arrays.stream(nums).max().getAsInt();//返回数组的最大值 int ans = 0; while (left<=right){ int mid = (right+left)/2; int loop = 0; for (int i:nums) { loop += (i-1)/mid; } if (loop<=maxOperations){ ans = mid; right = mid-1; }else { left = mid+1; } } return ans; } public static void main(String[] args) { System.out.println(minimumSize(new int[]{ 9},2)); System.out.println(minimumSize(new int[]{ 2,4,8,2},4)); } }
结果如下: