สมมติว่าเรามีรายการตัวเลขที่เรียกว่า nums และอีกค่าหนึ่งคือ k เราต้องหาค่าเฉลี่ยที่ใหญ่ที่สุดของรายการย่อยของรายการที่มีความยาวอย่างน้อย k
ดังนั้น หากอินพุตมีค่าเท่ากับ nums =[2, 10, -50, 4, 6, 6] k =3 ผลลัพธ์จะเป็น 5.333333333 เนื่องจากรายการย่อย [4, 6, 6] จะมีค่าเฉลี่ยที่ใหญ่ที่สุดพี>
เพื่อแก้ปัญหานี้ เราจะทำตามขั้นตอนเหล่านี้ -
-
ซ้าย :=ต่ำสุด nums ขวา :=สูงสุด nums
-
s :=ผลรวมของตัวเลขทั้งหมดเป็น nums จากดัชนี 0 ถึง k − 1
-
ใหญ่ที่สุด_avg :=s / k
-
ขณะที่ซ้าย <=ขวา ทำ
-
กลาง :=จำนวนเต็มของ (ซ้าย + ขวา) / 2
-
sum1 :=s, เฉลี่ย :=s / k, sum2 :=0, cnt :=0
-
สำหรับฉันในช่วง k ถึงขนาดของ nums ทำ
-
sum1 :=sum1 + nums[i]
-
sum2 :=sum2 + nums[i − k]
-
cnt :=cnt + 1
-
avg :=สูงสุดของ avg และ (sum1 /(cnt + k))
-
ถ้า sum2 / cnt <=กลาง แล้ว
-
sum1 :=sum1 − sum2
-
cnt :=0, sum2 :=0
-
-
avg :=สูงสุดของ avg และ (sum1 /(cnt + k))
-
-
ใหญ่ที่สุด_avg :=สูงสุดของที่ใหญ่ที่สุด_เฉลี่ยและเฉลี่ย
-
ถ้าเฉลี่ย> กลาง แล้ว
-
ซ้าย :=กลาง + 1
-
-
มิฉะนั้น
-
ขวา :=กลาง − 1
-
-
-
ส่งคืนที่ใหญ่ที่สุด_avg
ให้เราดูการใช้งานต่อไปนี้เพื่อความเข้าใจที่ดีขึ้น -
ตัวอย่าง
class Solution: def solve(self, nums, k): left, right = min(nums), max(nums) s = sum(nums[:k]) largest_avg = s / k while left <= right: mid = (left + right) // 2 sum1 = s avg = s / k sum2 = 0 cnt = 0 for i in range(k, len(nums)): sum1 += nums[i] sum2 += nums[i − k] cnt += 1 avg = max(avg, sum1 / (cnt + k)) if sum2 / cnt <= mid: sum1 −= sum2 cnt = 0 sum2 = 0 avg = max(avg, sum1 / (cnt + k)) largest_avg = max(largest_avg, avg) if avg > mid: left = mid + 1 else: right = mid − 1 return largest_avg ob = Solution() nums = [2, 10, −50, 4, 6, 6] k = 3 print(ob.solve(nums, k))
อินพุต
[2, 10, −50, 4, 6, 6], k = 3
ผลลัพธ์
5.333333333333333