ด้วยอาร์เรย์ของจำนวนเต็มบวก ภารกิจคือการลบอาร์เรย์ย่อยที่มีองค์ประกอบเฉพาะทั้งหมด สิ่งที่คุณได้รับจากการลบอาร์เรย์ย่อยจะเท่ากับผลรวมขององค์ประกอบ
คืนค่าผลรวมสูงสุดของอาร์เรย์ย่อยปัจจุบันโดยลบเงื่อนไขก่อนหรือหลัง เราสามารถดึงผลรวมสูงสุดของอาร์เรย์ย่อยออกได้เพียง 1 รายการ
อาร์เรย์ arr เรียกว่าเป็นอาร์เรย์ย่อยของ a ถ้ามันก่อตัวต่อเนื่องกันของ a นั่นคือถ้ามันเท่ากับ a[l], a[l+1],..., a[r] สำหรับบางคน (l,r) ตัวอย่างเช่น
อินพุต-1 −
arr[ ] = { 1,2,4,5,6 }
ผลผลิต −
17
คำอธิบาย − อาร์เรย์ย่อยที่เหมาะสมที่สุดคือ {2,4,5,6}
อินพุต-2 −
arr[ ]= {5,3,1,3,5,3,1,3,5}
ผลผลิต −
9
คำอธิบาย − อาร์เรย์ย่อยที่เหมาะสมที่สุดคือ {5,3,1} หรือ {1,3,5}
แนวทางการแก้ปัญหานี้
เพื่อแก้ปัญหานี้ เราจะใช้แนวคิดของหน้าต่างบานเลื่อน เทคนิคนี้แสดงวิธีการแปลงลูปที่ซ้อนกันเป็นลูปเดียวเพื่อลดความซับซ้อนของเวลา
ในเทคนิคนี้ ก่อนอื่นเราจะเริ่มต้นตัวชี้สองตัวสำหรับ (ซ้ายและขวา) และขนาดของหน้าต่างเป็น 'win' ในขณะที่วนซ้ำผ่านอาร์เรย์ เราจะตรวจสอบว่าขนาดของการชนะนั้นสูงสุดหรือไม่ หากเราพบว่ามีค่าสูงสุด เราจะส่งคืนเป็นผลลัพธ์
แนวทางการแก้ปัญหานี้
-
รับอินพุตอาร์เรย์ของจำนวนเต็มบวก
-
ฟังก์ชันจำนวนเต็ม maximumUniqueSubarray(vector&arr) รับอาร์เรย์เป็นอินพุต
-
ใช้ตัวชี้สามตัว 'I', 'j' และขนาดหน้าต่าง 'ชนะ' และวนซ้ำเหนืออาร์เรย์และค้นหาว่าหน้าต่างปัจจุบันที่มีองค์ประกอบอยู่ใน HashSet หรือไม่ จากนั้นให้ย้ายหน้าต่างและตรวจสอบองค์ประกอบอื่นอีกครั้ง หากไม่มีอยู่ ให้แทรกลงใน HashSet และลดขนาดหน้าต่างที่จะลบองค์ประกอบก่อนหน้า
-
หาค่าสูงสุดในผลลัพธ์และค่าของกรอบเวลา
-
ส่งคืนผลลัพธ์
ตัวอย่าง
#include<bits/stdc++.h> using namespace std; int maximumUniqueSubarray(vector<int>& arr) { int result = 0; unordered_set<int> hashset; for (int i = 0, j = 0, win = 0; j < arr.size(); j++) { while (hashset.find(arr[j]) != hashset.end()) { hashset.erase(arr[i]); win -= arr[i]; i++; } hashset.insert(arr[j]); win += arr[j]; result = max(result, win); } return result; } int main(){ vector<int>nums; nums<<5,3,1,3,5,3,1,3,5; cout<<maximumUniqueSubarray(nums)<<endl; return 0; }
ผลลัพธ์
การเรียกใช้โค้ดด้านบนจะสร้างผลลัพธ์เป็น
9