@@ -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