Computer >> คอมพิวเตอร์ >  >> การเขียนโปรแกรม >> C++

ค่าการลบสูงสุดใน C++


ด้วยอาร์เรย์ของจำนวนเต็มบวก ภารกิจคือการลบอาร์เรย์ย่อยที่มีองค์ประกอบเฉพาะทั้งหมด สิ่งที่คุณได้รับจากการลบอาร์เรย์ย่อยจะเท่ากับผลรวมขององค์ประกอบ

คืนค่าผลรวมสูงสุดของอาร์เรย์ย่อยปัจจุบันโดยลบเงื่อนไขก่อนหรือหลัง เราสามารถดึงผลรวมสูงสุดของอาร์เรย์ย่อยออกได้เพียง 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