มีอาร์เรย์ ต้องหาผลรวมถ่วงน้ำหนัก (weighted sum) สูงสุดเมื่อหมุนเวียนอาร์เรย์ น้ำหนักคือ S = Σ i * nums[i] (1-indexed)
ตัวอย่าง: L=[5,3,4] ผลลัพธ์ 26 (หมุนเป็น [3,4,5]: 1×3+2×4+3×5=26)
วิธีแก้ปัญหา (O(n) Formula)
sum_a = sum(nums)cur = ans = Σ nums[i]*(i+1)- วน
i=0..n-1:cur = cur - sum_a + nums[i]*n,ans = max(ans, cur)
เหตุผล: หมุนซ้าย 1 ตำแหน่ง ทุกค่าลดน้ำหนัก 1 (ลบ sum_a) ตัวแรกกลายเป็นตัวสุดท้ายน้ำหนัก n (บวก nums[i]*n)
ตัวอย่างโค้ด
def solve(nums):
n = len(nums)
sum_a = sum(nums)
cur_val = ans = sum(nums[i] * (i+1) for i in range(n))
for i in range(n):
cur_val = cur_val - sum_a + nums[i] * n
ans = max(ans, cur_val)
return ans
nums = [5,3,4]
print(solve(nums))
อินพุต
[5,3,4]
เอาต์พุต
26