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

สร้างจำนวนสูงสุดใน C ++


สมมติว่าเรามีอาร์เรย์สองอาร์เรย์ที่มีความยาว m และ n โดยมีตัวเลข 0-9 แทนตัวเลขสองตัว เราต้องสร้างจำนวนความยาวสูงสุด k ที่น้อยกว่า m + n จากตัวเลขทั้งสอง เราต้องจำไว้ว่าต้องรักษาลำดับสัมพัทธ์ของตัวเลขจากอาร์เรย์เดียวกัน เราต้องหาอาร์เรย์ของตัวเลข k ดังนั้นหากอินพุตเป็นเช่น [3,4,7,5] และ [9,1,3,5,8,4] และ k =5 คำตอบจะเป็น [9,8,7,5,4 ].

เพื่อแก้ปัญหานี้ เราจะทำตามขั้นตอนเหล่านี้ -

  • กำหนดฟังก์ชัน mergeThem() ซึ่งจะใช้อาร์เรย์ nums1 อาร์เรย์ nums2
  • กำหนดอาร์เรย์ ret
  • ผม :=0, j :=0, n :=ขนาดของ nums1, m :=ขนาดของ nums2
  • ในขณะที่ (i
  • ถ้าเรียกใช้ฟังก์ชันมากขึ้น (nums1, nums2, i, j) เป็นจริง −
    • ใส่ nums1[i] ที่ส่วนท้ายของ ret
    • (เพิ่ม i ขึ้น 1)
  • มิฉะนั้น
    • แทรก nums2[j] ที่ส่วนท้ายของ ret
    • (เพิ่ม j ขึ้น 1)
  • คืนสินค้า
  • กำหนดฟังก์ชัน modified() ซึ่งจะใช้อาร์เรย์ v, k,
  • กำหนดหนึ่งสแต็ก st
  • กำหนดอาร์เรย์ ret
  • สำหรับการเริ่มต้น i :=0 เมื่อ i <ขนาด v อัปเดต (เพิ่ม i ขึ้น 1) ทำ −
    • x :=v[i]
    • ในขณะที่ (st ไม่ว่างและองค์ประกอบบนสุดของ st =k) ทำ −
      • ลบองค์ประกอบออกจาก st
    • ถ้าขนาดของ st
    • ใส่ x เข้าไปใน st
  • ในขณะที่ (ไม่ว่าง) ทำ −
    • ใส่องค์ประกอบด้านบนของ st ที่ส่วนท้ายของ ret
    • ลบองค์ประกอบออกจาก st
  • ย้อนกลับอาร์เรย์ ret
  • คืนสินค้า
  • กำหนดฟังก์ชันที่มากขึ้น () ซึ่งจะรับอาร์เรย์ a, อาร์เรย์ b, i, j,
  • ในขณะที่ (i <ขนาดของ a และ j <ขนาดของ b และ a[i] เท่ากับ b[j]) ให้ทำ −
    • เพิ่ม i 1 และเพิ่ม j 1
  • คืนค่าจริงเมื่อ j ==ขนาดของ b หรือ i <ขนาดของ a และ a[i]> b[j]
  • จากวิธีหลัก ให้ทำดังนี้:
  • กำหนดอาร์เรย์ ret
  • n :=ขนาดของ nums1
  • ม :=ขนาดของ nums2
  • สำหรับการเริ่มต้น i :=0, เมื่อ i <=k, อัปเดต (เพิ่ม i ขึ้น 1), ทำ −
    • ถ้าฉัน <=n และ (k - i) <=m แล้ว −
      • กำหนดตัวเลือกอาร์เรย์ =mergeThem(modify(nums1, i), modified(nums2, k - i))
      • ถ้ามากกว่า(ผู้สมัคร, ret, 0, 0) เป็นจริง −
      • ret :=ผู้สมัคร
  • คืนสินค้า
  • ให้เราดูการใช้งานต่อไปนี้เพื่อความเข้าใจที่ดีขึ้น -

    ตัวอย่าง

    #include <bits/stdc++.h>
    using namespace std;
    void print_vector(vector<auto> v){
       cout << "[";
       for(int i = 0; i<v.size(); i++){
          cout << v[i] << ", ";
       }
       cout << "]"<<endl;
    }
    class Solution {
    public:
       vector<int> mergeThem(vector<int> nums1, vector<int> nums2)
       {
          vector<int> ret;
          int i = 0;
          int j = 0;
          int n = nums1.size();
          int m = nums2.size();
          while (i < n || j < m) {
             if (greater(nums1, nums2, i, j)) {
                ret.push_back(nums1[i]);
                i++;
             }
             else {
                ret.push_back(nums2[j]);
                j++;
             }
          }
          return ret;
       }
       vector<int> modify(vector<int>& v, int k)
       {
          stack<int> st;
          vector<int> ret;
          for (int i = 0; i < v.size(); i++) {
             int x = v[i];
             while (!st.empty() && st.top() < x && st.size() + (v.size() - i) - 1 >= k) {
                st.pop();
             }
             if (st.size() < k)
                st.push(x);
             }
             while (!st.empty()) {
                ret.push_back(st.top());
                st.pop();
             }
             reverse(ret.begin(), ret.end());
             return ret;
          }
          bool greater(vector<int>& a, vector<int>& b, int i, int j)
          {
             while (i < a.size() && j < b.size() && a[i] == b[j])
             i++, j++;
             return j == b.size() || (i < a.size() && a[i] > b[j]);
          }
          vector<int> maxNumber(vector<int>& nums1, vector<int>& nums2, int k)
          {
             vector<int> ret;
             int n = nums1.size();
             int m = nums2.size();
             for (int i = 0; i <= k; i++) {
                if (i <= n && (k - i) <= m) {
                   vector<int> candidate = mergeThem(modify(nums1, i), modify(nums2, k - i));
                   if (greater(candidate, ret, 0, 0)) {
                      ret = candidate;
                   }
                }
             }
             return ret;
         }
    };
    main() {
       Solution ob;
       vector<int> v = { 3, 4, 7, 5 }, v1 = { 9, 1, 3, 5, 8, 4 };
       print_vector(ob.maxNumber(v, v1, 5));
    }

    อินพุต

    { 3, 4, 7, 5 }
    { 9, 1, 3, 5, 8, 4 }
    5

    ผลลัพธ์

    [9, 8, 7, 5, 4, ]