C++でカバーされた間隔を削除する
間隔のリストがあるとすると、リスト内の別の間隔でカバーされているすべての間隔を削除する必要があります。ここで、区間[a、b)は、c<=aおよびb<=dの場合に限り、区間[c、d)でカバーされます。したがって、そうした後、残りの間隔の数を返す必要があります。入力が[[1,4]、[3,6]、[2,8]]の場合、出力は2になります。間隔[3,6]は[1,4]と[2 、8]なので、出力は2になります。
これを解決するには、次の手順に従います-
- 終了時間に基づいて間隔リストを並べ替えます
- スタックstを定義する
- 0からa–1のサイズのiの場合
- スタックが空またはa[i]で、スタックの上部の間隔が交差している場合、
- a[i]をstに挿入
- それ以外の場合
- temp:=a [i]
- stが空ではなく、tempとstacktopの間隔が交差している間
- スタックからポップ
- 温度をstに挿入
- スタックが空またはa[i]で、スタックの上部の間隔が交差している場合、
- stのリターンサイズ。
理解を深めるために、次の実装を見てみましょう-
#include <bits/stdc++.h>
using namespace std;
class Solution {
public:
bool intersect(vector <int>& a, vector <int>& b){
return (b[0] <= a[0] && b[1] >= a[1]) || (a[0] <= b[0] && a[1] >= b[1]);
}
static bool cmp(vector <int> a, vector <int> b){
return a[1] < b[1];
}
void printVector(vector < vector <int> > a){
for(int i = 0; i < a.size(); i++){
cout << a[i][0] << " " << a[i][1] << endl;
}
cout << endl;
}
int removeCoveredIntervals(vector<vector<int>>& a) {
sort(a.begin(), a.end(), cmp);
stack < vector <int> > st;
for(int i = 0; i < a.size(); i++){
if(st.empty() || !intersect(a[i], st.top())){
st.push(a[i]);
}
else{
vector <int> temp = a[i];
while(!st.empty() && intersect(temp, st.top())){
st.pop();
}
st.push(temp);
}
}
return st.size();
}
};
main(){
vector<vector<int>> v = {{1,4},{3,6},{2,8}};
Solution ob;
cout << (ob.removeCoveredIntervals(v));
} 入力
[[1,4],[3,6],[2,8]]
出力
2
-
C++でのvector::resize()とvector ::reserved()
ベクトルには、要素が挿入または削除されたときに動的配列のように自動的にサイズを変更する機能があり、コンテナはストレージを自動的に処理します。 vector resize()とvector reserved()の主な違いは、resize()がベクトルのサイズを変更するために使用されることです。reserve()は使用されません。reserve()は、少なくとも指定された要素の数を格納するためにのみ使用されます。メモリを再割り当てする必要はありません。ただし、resize()では、数値が現在の数値よりも小さい場合、メモリのサイズが変更され、その上の余分なスペースが削除されます。 vector
-
C++での型推論
型推論または推論とは、プログラミング言語での式のデータ型の自動検出を指します。これは、いくつかの強く静的に型付けされた言語に存在する機能です。 C ++では、autoキーワード(C ++ 11で追加)が自動型推定に使用されます。たとえば、ベクトルを反復処理するイテレータを作成する場合、その目的でautoを使用するだけです。 例 #include<iostream> #include<vector> using namespace std; int main() { vector<int> arr(10);