23.05.04每日一题
题目意思是二维数组fruilts保存了,那些点位有多少水果,现在给一个坐标出发点,然后可以移动k步,求最多可以获得多少果实。
可以转换成为求一个可变区间在什么时候果实数量最大,通过步数和起始点就能够得到区间的左右边界值,然后使用二分来快速计算区间内的果子,最后求得最大值。
class Solution {
int[][] f;
public int maxTotalFruits(int[][] fruits, int startPos, int k) {
//思路转换
this.f=fruits;
int n=fruits.length;
int[] sum=new int[n+1];
for(int i=0;i<n;i++){
sum[i+1]=sum[i]+fruits[i][1];
}
int ans=0;
for(int i=0;i<=k/2;i++){
int j=k-2*i;
int l=startPos-i;
int r=startPos+j;
ans=Math.max(ans,sum[search(r+1)]-sum[search(l)]);
l=startPos-j;
r=startPos+i;
ans=Math.max(ans,sum[search(r+1)]-sum[search(l)]);
}
return ans;
}
public int search(int target){
int l=0;
int r=f.length;
while(l<r){
int mid=l+r>>1;
if(f[mid][0]<target){
l=mid+1;
}else{
r=mid;
}
}
return l;
}
}
时间复杂度O(n+klogn)
空间复杂度O(n)