力扣每日打卡:边界值加贪心算法
1802. 有界数组中指定下标处的最大值
需求是给定数组;[ , , , , index, , ,num(length-1)] 要求数组和小于max,相邻的差小于1,但是要保证num[index]为最大。
简化场景:
class Solution {
/**
* 相邻元素,从左到右,差的绝对值不大于1,和不大于max。nums[index]为当前数组中的最大值。
* 1-10-n求和
* maxsum = (1+n)n/2
*
* 根据这一公式 来进行边界预警,看是否超过max
* **/
public int maxValue(int n, int index, int maxSum) {
// l r是 nums[index]的边界值
int l=1,r=maxSum;
while(l<r){
//防止死循环+1
int mid= (l+r+1)/2;
// 判断是取小还是取大
if(mid+sumi(mid,index)+sumi(mid,n-index-1)<=maxSum){
l = mid;
}else{
r = mid -1;
}
}
return l;
}
// mid实际就是在试探nums[index] len是index到边界的长度
public long sumi(int mid,int len){
// 判断index旁边的一个值是否到边界刚好能1;如果不能因为还有富足
if(mid-1>len){
int small_num = mid-len;//算下左边界最小值。
return (long)(small_num+(mid-1))*len/2;
}else{
//这种 就是 1 1 1 1 1 ... mid-1 mid;
int one_num = len-(mid-1);
// 1....mid-1 = (mid-1+1)*(mid-1)/2;
return (long)(mid-1)*mid/2 +one_num;
}
}
}
发表评论