สมมติว่าเรามีซองจดหมายบางซอง ซองจดหมายเหล่านี้มีค่าความสูงและความกว้างเป็นคู่ เราสามารถใส่ซองหนึ่งเข้าไปในอีกซองหนึ่งได้หากความสูงและความกว้างของซองที่สองทั้งสองมีขนาดเล็กกว่าความสูงและความกว้างของซองแรก แล้วจำนวนซองสูงสุดที่เราใส่เข้าไปได้จะเป็นเท่าไหร่ ดังนั้น หากอินพุตเป็น [[5,5], [6,4], [6,8], [2,3]] เอาต์พุตจะเป็น 3 เนื่องจากซองที่เล็กที่สุดคือ [2,3] จากนั้น [5,5] แล้วก็ [6,8].
เพื่อแก้ปัญหานี้ เราจะทำตามขั้นตอนเหล่านี้ -
- จัดเรียงอาร์เรย์ v ตามความสูง เมื่อความสูงเท่ากัน เปรียบเทียบกับความกว้าง
- ถ้าขนาดของ v เท่ากับ 0 แล้ว −
- คืน 0
- กำหนดอาร์เรย์ ret
- สำหรับการเริ่มต้น i :=0 เมื่อ i <ขนาด v อัปเดต (เพิ่ม i ขึ้น 1) ทำ −
- กำหนดอาร์เรย์ชั่วคราว =v[i]
- x :=อุณหภูมิ[1]
- ต่ำ :=0, สูง :=ขนาดของ ret, curr :=0
- ในขณะที่ต่ำ <=สูง ทำ −
- กลาง :=ต่ำ + (สูง - ต่ำ) / 2
- ถ้า ret[กลาง]
- curr :=กลาง + 1
- ต่ำ :=กลาง + 1
- มิฉะนั้น
- สูง :=กลาง - 1
- ถ้า curr <0 แล้ว −
- ไม่ต้องสนใจตอนต่อไป ข้ามไปที่ตอนต่อไป
- ถ้า curr>=ขนาดของ ret แล้ว −
- ใส่ temp[1] ที่ส่วนท้ายของ ret
- มิฉะนั้น
- ret[curr] :=temp[1]
ให้เราดูการใช้งานต่อไปนี้เพื่อความเข้าใจที่ดีขึ้น -
ตัวอย่าง
#include <bits/stdc++.h>
using namespace std;
class Solution {
public:
static bool cmp(vector <int> a, vector <int> b){
if(a[0] == b[0])return a[1] > b[1];
return a[0] < b[0];
}
int maxEnvelopes(vector<vector<int>>& v) {
sort(v.begin(), v.end(), cmp);
if(v.size() == 0)return 0;
vector <int> ret;
for(int i = 0; i < v.size(); i++){
vector <int> temp = v[i];
int x = temp[1];
int low = 0;
int high = ret.size() -1;
int curr = 0;
while(low <= high){
int mid = low + (high - low) / 2;
if(ret[mid]<temp[1]){
curr = mid + 1;
low = mid + 1;
}else{
high = mid - 1;
}
}
if(curr < 0) continue;
if(curr >= (int)ret.size()){
ret.push_back(temp[1]);;
}else{
ret[curr] = temp[1];
}
}
return ret.size();
}
};
main(){
Solution ob;
vector<vector<int>> v = {{5,5}, {6,4}, {6,8}, {2,3}};
cout << (ob.maxEnvelopes(v));
} อินพุต
{{5,5}, {6,4}, {6,8}, {2,3}} ผลลัพธ์
3