Skip to content

Commit da95d89

Browse files
committed
1
1 parent 5b751d1 commit da95d89

File tree

1 file changed

+264
-1
lines changed

1 file changed

+264
-1
lines changed

notes/src/remains.md

Lines changed: 264 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -664,4 +664,267 @@ public:
664664

665665
# 452. 用最少数量的箭引爆气球
666666

667-
https://programmercarl.com/0452.%E7%94%A8%E6%9C%80%E5%B0%91%E6%95%B0%E9%87%8F%E7%9A%84%E7%AE%AD%E5%BC%95%E7%88%86%E6%B0%94%E7%90%83.html
667+
想不出来用什么数据结构
668+
669+
```cpp
670+
class Solution {
671+
public:
672+
int findMinArrowShots(vector<vector<int>>& v) {
673+
int res = 1;
674+
sort(v.begin(),v.end());
675+
for ( int i = 1 ; i < v.size(); i ++ ) {
676+
if ( v[i][0] > v[i-1][1] ) {
677+
res ++ ;
678+
} else {
679+
v[i][1] = min(v[i][1],v[i-1][1]);
680+
}
681+
}
682+
return res;
683+
}
684+
};
685+
```
686+
687+
发现不用数据结构,要点是每次右端点取重合的最小值
688+
689+
```plaintext
690+
======
691+
====================
692+
```
693+
694+
# 435. 无重叠区间
695+
696+
```cpp
697+
bool f(const vector<int>&a,const vector<int>&b) {
698+
if(a[0]==b[0])return a[1]>b[1];return a[0]<b[0];
699+
}
700+
class Solution {
701+
public:
702+
int eraseOverlapIntervals(vector<vector<int>>& v) {
703+
int res = 0;
704+
sort(v.begin(),v.end(),f);
705+
for ( int i = 1 ; i < v.size(); i ++ ) {
706+
cout << v[i][0] << v[i][1] << endl;
707+
if ( v[i][0] >= v[i-1][1] ) {
708+
} else {
709+
res ++ ;
710+
// v[i][1] = min(v[i][1],v[i-1][1]);
711+
}
712+
}
713+
return res;
714+
}
715+
};
716+
```
717+
718+
不会做,不知道怎么处理这种情况
719+
720+
```plaintext
721+
------- ------- ------- -------
722+
====== ======= ====== ======= =====
723+
```
724+
725+
`需要移除区间的最小数量,使剩余区间互不重叠` -> 求最大的不交叉区间个数
726+
727+
```cpp
728+
bool f(const vector<int>&a,const vector<int>&b) {
729+
return a[1]<b[1];
730+
}
731+
class Solution {
732+
public:
733+
int eraseOverlapIntervals(vector<vector<int>>& v) {
734+
int cnt = 1;
735+
sort(v.begin(),v.end(),f);
736+
int rend = v[0][1];
737+
for ( int i = 1 ; i < v.size(); i ++ ) {
738+
if (rend <= v[i][0]) {
739+
rend = v[i][1];
740+
cnt ++ ;
741+
}
742+
}
743+
return v.size() - cnt;
744+
}
745+
};
746+
```
747+
748+
通用技巧,求不重合区间的最大个数
749+
750+
# 763.划分字母区间
751+
752+
```cpp
753+
class Solution {
754+
public:
755+
vector<int> partitionLabels(string s) {
756+
int v[26] = {0};
757+
vector<int> res;
758+
for (int i = 0; i < s.size(); i ++ ) {
759+
v[s[i]-'a']=i;
760+
}
761+
int last = v[s[0]-'a'];
762+
int pre = 0;
763+
for (int i = 0; i < s.size(); i ++ ) {
764+
last = max(last,v[s[i]-'a']);
765+
if (last == i) {
766+
res.push_back(i - pre + 1);
767+
pre = i + 1;
768+
}
769+
}
770+
return res;
771+
}
772+
};
773+
```
774+
775+
# 56. 合并区间
776+
777+
```cpp
778+
bool f(const vector<int>&a,const vector<int>&b) {
779+
if(a[0]==b[0])return a[1]<b[1];return a[0]<b[0];
780+
}
781+
class Solution {
782+
public:
783+
vector<vector<int>>res;
784+
vector<vector<int>> merge(vector<vector<int>>& v) {
785+
sort(v.begin(),v.end(),f);
786+
int l = v[0][0], r = v[0][1];
787+
for ( int i = 1; i < v.size(); i ++ ) {
788+
if (v[i][0]<=r) r = max(r,v[i][1]);
789+
else {
790+
res.push_back(vector<int>{l, r});
791+
l = v[i][0];
792+
r = v[i][1];
793+
}
794+
}
795+
res.push_back(vector<int>{l, r});
796+
return res;
797+
}
798+
};
799+
```
800+
801+
这个 很直接
802+
803+
# 738.单调递增的数字
804+
805+
```cpp
806+
class Solution {
807+
public:
808+
int monotoneIncreasingDigits(int n) {
809+
vector <int> a;
810+
int nn = n;
811+
while(n > 0) {
812+
int item = n % 10;
813+
a.push_back(item);
814+
n /= 10;
815+
}
816+
reverse(a.begin(),a.end());
817+
for (int i = 1; i < a.size(); i ++ ) {
818+
if (a[i] < a[i-1]) {
819+
int cnt = a.size() - i;
820+
int shift = cnt;
821+
int right = 0;
822+
while (cnt > 0) {
823+
right *= 10;
824+
right += 9;
825+
cnt -- ;
826+
}
827+
int left = 0;
828+
for (int j = 0; j < i; j ++ ) {
829+
left *= 10;
830+
left += a[j];
831+
}
832+
left = monotoneIncreasingDigits(left - 1);
833+
return left * 10 * shift + right;
834+
}
835+
}
836+
return nn;
837+
// 1232 -> 1229
838+
// 2312 -> 2299
839+
// 9123 -> 8999
840+
// 100001 ->
841+
}
842+
};
843+
```
844+
845+
846+
332 -- 329 ×
847+
332 -- 299 √
848+
想不出了,原来是要从后往前
849+
850+
```cpp
851+
class Solution {
852+
public:
853+
int monotoneIncreasingDigits(int n) {
854+
string s = to_string(n);
855+
int flag = s.size();
856+
for ( int i = s.size() - 1; i > 0; i -- ) {
857+
if (s[i-1] > s[i]) {
858+
flag = i;
859+
s[i-1] -- ;
860+
}
861+
}
862+
for ( int i = flag; i < s.size() ; i ++ ) {
863+
s[i] = '9';
864+
}
865+
return stoi(s);
866+
}
867+
};
868+
```
869+
870+
草 真优雅
871+
872+
# 968.监控二叉树
873+
874+
```cpp
875+
class Solution {
876+
public:
877+
int cnt = 0;
878+
bool f(TreeNode*r) { // should not be null
879+
// if(!r)return true;
880+
if(!r->left&&!r->right)return false; // no monitor
881+
bool lres = false;
882+
if(r->left)res=f(r->left);
883+
if(!res&&r->right)res=f(r->right);
884+
if(res == true) return false;
885+
else {
886+
cnt ++ ;
887+
return true;
888+
}
889+
}
890+
int minCameraCover(TreeNode* r) {if(!r->left&&!r->right)return 1;
891+
f(r);
892+
return cnt;
893+
}
894+
};
895+
```
896+
897+
想不明白:在二叉树中如何从低向上推导呢?
898+
899+
```cpp
900+
class Solution {
901+
public:
902+
int cnt = 0;
903+
int f(TreeNode*p) {
904+
// 0 -- 没有覆盖
905+
// 1 -- 有覆盖了
906+
// 2 -- 有摄像头
907+
if(!p)return 1;
908+
int l = f(p->left);
909+
int r = f(p->right);
910+
if (l==1 && r==1) return 0;//////
911+
if (l==0 || r==0) {//////////////
912+
cnt ++ ;
913+
return 2;
914+
}
915+
return 1;
916+
}
917+
int minCameraCover(TreeNode* r) {if(!r->left&&!r->right)return 1;
918+
if(f(r)==0)cnt++;///////
919+
return cnt;
920+
}
921+
};
922+
```
923+
924+
[0,0,null,null,0,0,null,null,0,0]
925+
0
926+
0 n
927+
n 0
928+
0 n
929+
n 0
930+
0

0 commit comments

Comments
 (0)