1
การนับจำนวนผลรวมจากอาร์เรย์ย่อยที่ต่อเนื่องกันของอาร์เรย์
เราได้รับอาร์เรย์กับทั้งหมดa[1…n]a[1…n]a[1 \ldots n]a[i]>0a[i]>0a[i]>0 ตอนนี้เราต้องการค้นหาจำนวนผลรวมที่แตกต่างจาก subarrays ของมัน (ที่ subarray เป็นช่วงต่อเนื่องของอาร์เรย์คือสำหรับ , ผลรวมคือผลรวมของทั้งหมด องค์ประกอบของ subarray) ตัวอย่างเช่นถ้าแล้วคำตอบคือ 4: เราสามารถสร้าง1,2,3,4a[j…k]a[j…k]a[j\ldots k]j,kj,kj,ka=[1,2,1]a=[1,2,1]a=[1,2,1]1,2,3,41,2,3,4 1,2,3,4 ฉันรู้วิธีการนับจำนวนของจำนวนเงินที่แตกต่างกันในเวลาO(n2)O(n2)O(n^2) ยิ่งกว่านั้นฉันได้ตระหนักว่านี่คล้ายกับปัญหาคลาสสิคที่เราต้องการค้นหาจำนวนสตริงย่อยที่แตกต่างกันของสตริง ฉันกำลังคิดถึงความเป็นไปได้ในการสร้างอาเรย์ต่อท้ายและแก้ไขในลักษณะที่คล้ายกัน (ในเวลา ) แต่ฉันไม่สามารถหาวิธีแก้ไขได้ที่นี่ ตัวอย่างเช่นถ้าเราใช้ส่วนต่อท้ายสำหรับเราจะได้รับ 5 กรณีแทนที่จะเป็นสี่ที่ยอมรับได้ เป็นไปได้ที่จะทำเช่นนี้โดยใช้อาร์เรย์ต่อท้ายหรือฉันคิดผิดทิศทาง?O(n)O(n)O(n)a=[1,2,1]a=[1,2,1]a=[1,2,1] นอกจากนี้ยังมีอีกหนึ่งทิศทางที่ฉันคิดอยู่แบ่งและพิชิต เช่นถ้าฉันแบ่งอาร์เรย์ออกเป็นสองส่วนทุกครั้งจนกว่าจะลดลงเป็นองค์ประกอบเดียว องค์ประกอบเดียวสามารถมีหนึ่งผลรวม ทีนี้ถ้าเรารวมสององค์ประกอบเดียวเข้าด้วยกันมันสามารถทำได้สองวิธี: ถ้าทั้งสองช่วงมีองค์ประกอบเดียวกันเราจะได้รับผลรวม 2 อันที่แตกต่างกันหรือถ้าทั้งสองมีองค์ประกอบต่างกัน แต่ฉันไม่สามารถที่จะพูดถึงเรื่องนี้สำหรับการรวมอาร์เรย์ที่มีความยาวมากกว่า 1 มันเป็นไปได้ไหมที่จะรวมอาร์เรย์ขนาดสองม. เข้ากับคำตอบใน ?O(m)O(m)O(m)