일부 봉투가 있다고 가정하고 이러한 봉투에는 높이와 너비 값이 쌍으로 있습니다. 두 번째 봉투의 높이와 너비가 모두 첫 번째 봉투의 높이와 너비보다 작으면 한 봉투를 다른 봉투에 넣을 수 있습니다. 그래서, 우리가 다른 봉투 안에 넣을 수 있는 최대 봉투 수는 몇 개입니까? 따라서 입력이 [[5,5], [6,4], [6,8], [2,3]]과 같으면 가장 작은 봉투가 [2,3]이므로 출력은 3이 됩니다. 다음 [5,5], 다음 [6,8].
이 문제를 해결하기 위해 다음 단계를 따릅니다. −
- 높이를 기준으로 배열 v 정렬, 높이가 같을 때 너비와 비교
- v의 크기가 0과 같으면 -
- 0을 반환
- ret 배열 정의
- 초기화 i의 경우:=0, i
- 배열 temp =v[i] 정의
- x :=온도[1]
- 낮음 :=0, 높음 :=ret 크기, curr :=0
- 낮은 <=높은 동안 −
- 중간 :=낮음 + (높음 - 낮음) / 2
- ret[mid]
- 커 :=중간 + 1
- 낮음 :=중간 + 1
- 그렇지 않으면
- 높음 :=중간 - 1
- 다음 부분은 무시하고 다음 반복으로 건너뜁니다.
- ret 끝에 temp[1] 삽입
- ret[curr] :=온도[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