สมมติว่ามีค่า n, index, maxSum ต้องหา nums[index] สูงสุดโดยอาร์เรย์ nums ต้องผ่านเงื่อนไข:
- ขนาด
n - ทุกค่าบวก
|nums[i] - nums[i+1]| <= 1- ผลรวมไม่เกิน
maxSum nums[index]สูงสุด
ตัวอย่าง: n=6, index=3, maxSum=8 ผลลัพธ์ 2 (อาร์เรย์ [1,2,2,2,1,1])
วิธีแก้ปัญหา (Binary Search)
left := maxSum//n, right := maxSum+1, ans := 0- วน
while left < right:mid := left + (right-left)//2- คำนวณ
ind_l(ผลรวมด้านซ้าย) และind_r(ด้านขวา) ของค่าmidที่ดัชนีindex - ถ้า
ind_l + ind_r <= maxSum:ans = mid, left = mid+1 - มิฉะนั้น:
right = mid
- คืน
ans
ตัวอย่างโค้ด
def solve(n, index, maxSum):
left, right = maxSum//n, maxSum+1
ans = 0
while left < right:
mid = left + (right-left)//2
ind_l = (mid-1+max(1,mid-index))*min(index,mid-1)//2 + abs(min(0,mid-index-1))
ind_r = (mid+max(1,mid-(n-index-1)))*min(n-index,mid)//2 + abs(min(0,mid-(n-index-1)-1))
if ind_l + ind_r <= maxSum:
ans = mid
left = mid+1
else:
right = mid
return ans
n = 6
index = 3
maxSum = 8
print(solve(n, index, maxSum))
อินพุต
6, 3, 8
เอาต์พุต
2