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

แทนที่องค์ประกอบด้วยค่าสูงสุดทางขวาใน C++

ปัญหา

ได้รับอาร์เรย์ A ต้องแทนที่ทุกองค์ประกอบด้วยค่าสูงสุดทางด้านขวาของมัน และตัวสุดท้ายแทนด้วย -1 เช่น A = [5, 17, 40, 6, 3, 8, 2] → [40, 40, 8, 8, 8, 2, -1]

วิธีแก้

  • อ่านอาร์เรย์จากขวาไปซ้าย
  • กำหนด e = -1
  • ลูป i = n-1 ถึง 0:
    • temp = e
    • e = max(e, arr[i])
    • arr[i] = temp
  • คืนค่า arr

ตัวอย่างโค้ด

#include <bits/stdc++.h>
using namespace std;

void print_vector(vector<int> v) {
    cout << "[";
    for (int i = 0; i < v.size(); i++) {
        cout << v[i] << ", ";
    }
    cout << "]" << endl;
}

class Solution {
public:
    vector<int> replaceElements(vector<int>& arr) {
        int rep = -1;
        int n = arr.size();
        for (int i = n - 1; i >= 0; i--) {
            int temp = rep;
            rep = max(rep, arr[i]);
            arr[i] = temp;
        }
        return arr;
    }
};

int main() {
    Solution ob;
    vector<int> c = {5, 17, 40, 6, 3, 8, 2};
    print_vector(ob.replaceElements(c));
}

อินพุต

[5, 17, 40, 6, 3, 8, 2]

เอาต์พุต

[40, 40, 8, 8, 8, 2, -1]

คำอธิบาย

อัลกอริทึม O(n) Single Pass จากขวาไปซ้าย เก็บค่าสูงสุดที่เจอมาในตัวแปร rep แต่ละรอบเก็บค่า rep เก่า (ซึ่งคือ max ทางขวา) ลง arr[i] แล้วอัปเดต rep = max(rep, arr[i] เดิม)