星环一面最后让写的题,一开始我在想怎么把原始数组拆分成多段然后分段求和,面试官提醒了我一下答案有个最小值和最大值,我马上反应过来是个二分查找,然后很快写完了。
注意判断当前值是否合法的valid方法里初始天数为1,我一开始写的0,面试官提醒我在结尾用 expectedDay + 1 <= days 判断,但是后来想了下,初始天数为1比较合理。
class Solution {
public int shipWithinDays(int[] weights, int days) {
int sum = 0;
int min = weights[0];
for(int w : weights){
sum += w;
min = Math.max(min, w);
}
int max = sum;
while(min < max){
int mid = min + ((max - min) >> 1);
//System.out.println(mid+" "+valid(mid, weights, days));
if(valid(mid, weights, days)){
max = mid;
}else{
min = mid + 1;
}
}
return min;
}
private boolean valid(int mid, int[] weights, int days){
int expectedDay = 1;
int tempSum = 0;
for(int w : weights){
if(tempSum + w <= mid){
tempSum += w;
}else{
tempSum = w;
expectedDay++;
}
}
//System.out.println(mid + " " + expectedDay);
return expectedDay <= days;
}
}