public class Solution {
/**
* @param cost: the cost
* @param val: the value
* @return: the all cost
*/
public long doingHomework(int[] cost, int[] val) {
// Write your code here.
long rs=0;
//返回结果,考虑到给的数值访问太大了,所以使用longlong形式,使用二分查找法来查找能做的最多作业
//因为求得是和,所以先将cost数组里面的的每种前n项和求一遍可以节省大量求和时间
int[] costSum = new int[cost.length];
int sum = 0;
for(int i=0;i<cost.length;i++){
sum=sum+cost[i];
costSum[i]=sum;
}
//使用for循环遍历每一个val,来判计算能完成的作业
for(int i=0;i<val.length;i++){
rs=rs+searchNum(costSum,val[i]);
}
return rs;
}
public long searchNum(int[] costSum,int n){
//如果能做完所有事情就直接返回costSum的最后一个值
if(n>=costSum[costSum.length-1]){
return costSum[costSum.length-1];
}
//如果一件事都完成不了,那就返回0
if(n<costSum[0]){
return 0;
}
//因为给的数值过大,所以用二分查找法快速查找
int left=0;
int right=costSum.length-1;
while (left < right) {
int mid = (right-1 + left) / 2;
if (costSum[mid] <= n && costSum[mid + 1] > n) { //这个n大于这个中间值却小于下一个,所以这个中间值是在小于n的情况下最接近n的
return costSum[mid];
} else if (costSum[mid] > n && costSum[mid - 1] <= n) {
//这个n小于这个中间值却大于上一个,所以这个中间值的前一个是在小于n的情况下最接近n的
return costSum[mid - 1];
} else if (costSum[mid] < n) {
//这个中间值小于n,所以需要往后面找
left = mid + 1;
} else {
//这个中间值大于n,所以需要往前面找
right = mid - 1;
}
}
return 0;
}
}
阿里云-天池-写作业
最新推荐文章于 2021-06-01 18:52:52 发布