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

ค่าการลบสูงสุด (Maximum Erasure Value) ใน C++

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

คืนค่าผลรวมสูงสุดของ subarray ปัจจุบันโดยการลบพจน์ก่อนหรือหลังมัน เราสามารถได้ผลรวมสูงสุดโดยการลบ subarray เพียงหนึ่ง subarray เท่านั้น

อาร์เรย์ arr เรียกว่า subarray ของ a หากมันเป็น subsequence ที่ติดต่อกันของ a นั่นคือเท่ากับ a[l], a[l+1],..., a[r] สำหรับบาง (l,r) ตัวอย่างเช่น

ตัวอย่างอินพุต 1

arr[] = {1, 2, 4, 5, 6}

เอาต์พุต

17

คำอธิบาย

Subarray ที่เหมาะสมที่สุดคือ {2, 4, 5, 6}

ตัวอย่างอินพุต 2

arr[] = {5, 3, 1, 3, 5, 3, 1, 3, 5}

เอาต์พุต

9

คำอธิบาย

Subarray ที่เหมาะสมที่สุดคือ {5, 3, 1} หรือ {1, 3, 5}

วิธีการแก้ปัญหา

เพื่อแก้ปัญหานี้ เราจะใช้แนวคิดของ Sliding Window เทคนิคนี้แสดงให้เห็นว่าลูปซ้อนสามารถแปลงเป็นลูปเดียวเพื่อลดความซับซ้อนด้านเวลาได้

ในเทคนิคนี้ เราจะเริ่มต้นตัวชี้สองตัวสำหรับ (left และ right) และขนาดของหน้าต่างเป็น 'win' ขณะวนลูปผ่านอาร์เรย์ เราจะตรวจสอบว่าขนาดของ win เฉพาะนั้นเป็นค่าสูงสุดหรือไม่ หากเราพบว่ามันสูงสุด เราจะคืนค่ามันเป็นเอาต์พุต

  • รับอินพุตอาร์เรย์ของจำนวนเต็มบวก
  • ฟังก์ชัน integer maximumUniqueSubarray(vector& arr) รับอาร์เรย์เป็นอินพุต
  • ใช้ตัวชี้สามตัว 'i', 'j' และขนาดหน้าต่าง 'win' และวนลูปผ่านอาร์เรย์และหาว่าถ้าหน้าต่างปัจจุบันที่มีองค์ประกอบอยู่ใน 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 = {5, 3, 1, 3, 5, 3, 1, 3, 5};
    cout << maximumUniqueSubarray(nums) << endl;
    return 0;
}

ผลลัพธ์

การรันโค้ดด้านบนจะสร้างเอาต์พุตเป็น

9