Skip to content

Commit

Permalink
Deploying to gh-pages from @ da95d89 🚀
Browse files Browse the repository at this point in the history
  • Loading branch information
Ainevsia committed Aug 8, 2023
1 parent acf9882 commit 37fa1e0
Show file tree
Hide file tree
Showing 4 changed files with 456 additions and 4 deletions.
228 changes: 227 additions & 1 deletion print.html
Original file line number Diff line number Diff line change
Expand Up @@ -3712,7 +3712,233 @@ <h1 id="406根据身高重建队列"><a class="header" href="#406根据身高重
</code></pre>
<p>先按照身高排序,固定住规律。按照k排序没法获得额外的规律</p>
<h1 id="452-用最少数量的箭引爆气球"><a class="header" href="#452-用最少数量的箭引爆气球">452. 用最少数量的箭引爆气球</a></h1>
<p>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</p>
<p>想不出来用什么数据结构</p>
<pre><code class="language-cpp">class Solution {
public:
int findMinArrowShots(vector&lt;vector&lt;int&gt;&gt;&amp; v) {
int res = 1;
sort(v.begin(),v.end());
for ( int i = 1 ; i &lt; v.size(); i ++ ) {
if ( v[i][0] &gt; v[i-1][1] ) {
res ++ ;
} else {
v[i][1] = min(v[i][1],v[i-1][1]);
}
}
return res;
}
};
</code></pre>
<p>发现不用数据结构,要点是每次右端点取重合的最小值</p>
<pre><code class="language-plaintext"> ======
====================
</code></pre>
<h1 id="435-无重叠区间"><a class="header" href="#435-无重叠区间">435. 无重叠区间</a></h1>
<pre><code class="language-cpp">bool f(const vector&lt;int&gt;&amp;a,const vector&lt;int&gt;&amp;b) {
if(a[0]==b[0])return a[1]&gt;b[1];return a[0]&lt;b[0];
}
class Solution {
public:
int eraseOverlapIntervals(vector&lt;vector&lt;int&gt;&gt;&amp; v) {
int res = 0;
sort(v.begin(),v.end(),f);
for ( int i = 1 ; i &lt; v.size(); i ++ ) {
cout &lt;&lt; v[i][0] &lt;&lt; v[i][1] &lt;&lt; endl;
if ( v[i][0] &gt;= v[i-1][1] ) {
} else {
res ++ ;
// v[i][1] = min(v[i][1],v[i-1][1]);
}
}
return res;
}
};
</code></pre>
<p>不会做,不知道怎么处理这种情况</p>
<pre><code class="language-plaintext"> ------- ------- ------- -------
====== ======= ====== ======= =====
</code></pre>
<p><code>需要移除区间的最小数量,使剩余区间互不重叠</code> -&gt; 求最大的不交叉区间个数</p>
<pre><code class="language-cpp">bool f(const vector&lt;int&gt;&amp;a,const vector&lt;int&gt;&amp;b) {
return a[1]&lt;b[1];
}
class Solution {
public:
int eraseOverlapIntervals(vector&lt;vector&lt;int&gt;&gt;&amp; v) {
int cnt = 1;
sort(v.begin(),v.end(),f);
int rend = v[0][1];
for ( int i = 1 ; i &lt; v.size(); i ++ ) {
if (rend &lt;= v[i][0]) {
rend = v[i][1];
cnt ++ ;
}
}
return v.size() - cnt;
}
};
</code></pre>
<p>通用技巧,求不重合区间的最大个数</p>
<h1 id="763划分字母区间"><a class="header" href="#763划分字母区间">763.划分字母区间</a></h1>
<pre><code class="language-cpp">class Solution {
public:
vector&lt;int&gt; partitionLabels(string s) {
int v[26] = {0};
vector&lt;int&gt; res;
for (int i = 0; i &lt; s.size(); i ++ ) {
v[s[i]-'a']=i;
}
int last = v[s[0]-'a'];
int pre = 0;
for (int i = 0; i &lt; s.size(); i ++ ) {
last = max(last,v[s[i]-'a']);
if (last == i) {
res.push_back(i - pre + 1);
pre = i + 1;
}
}
return res;
}
};
</code></pre>
<h1 id="56-合并区间"><a class="header" href="#56-合并区间">56. 合并区间</a></h1>
<pre><code class="language-cpp">bool f(const vector&lt;int&gt;&amp;a,const vector&lt;int&gt;&amp;b) {
if(a[0]==b[0])return a[1]&lt;b[1];return a[0]&lt;b[0];
}
class Solution {
public:
vector&lt;vector&lt;int&gt;&gt;res;
vector&lt;vector&lt;int&gt;&gt; merge(vector&lt;vector&lt;int&gt;&gt;&amp; v) {
sort(v.begin(),v.end(),f);
int l = v[0][0], r = v[0][1];
for ( int i = 1; i &lt; v.size(); i ++ ) {
if (v[i][0]&lt;=r) r = max(r,v[i][1]);
else {
res.push_back(vector&lt;int&gt;{l, r});
l = v[i][0];
r = v[i][1];
}
}
res.push_back(vector&lt;int&gt;{l, r});
return res;
}
};
</code></pre>
<p>这个 很直接</p>
<h1 id="738单调递增的数字"><a class="header" href="#738单调递增的数字">738.单调递增的数字</a></h1>
<pre><code class="language-cpp">class Solution {
public:
int monotoneIncreasingDigits(int n) {
vector &lt;int&gt; a;
int nn = n;
while(n &gt; 0) {
int item = n % 10;
a.push_back(item);
n /= 10;
}
reverse(a.begin(),a.end());
for (int i = 1; i &lt; a.size(); i ++ ) {
if (a[i] &lt; a[i-1]) {
int cnt = a.size() - i;
int shift = cnt;
int right = 0;
while (cnt &gt; 0) {
right *= 10;
right += 9;
cnt -- ;
}
int left = 0;
for (int j = 0; j &lt; i; j ++ ) {
left *= 10;
left += a[j];
}
left = monotoneIncreasingDigits(left - 1);
return left * 10 * shift + right;
}
}
return nn;
// 1232 -&gt; 1229
// 2312 -&gt; 2299
// 9123 -&gt; 8999
// 100001 -&gt;
}
};
</code></pre>
<p>332 -- 329 ×
332 -- 299 √
想不出了,原来是要从后往前</p>
<pre><code class="language-cpp">class Solution {
public:
int monotoneIncreasingDigits(int n) {
string s = to_string(n);
int flag = s.size();
for ( int i = s.size() - 1; i &gt; 0; i -- ) {
if (s[i-1] &gt; s[i]) {
flag = i;
s[i-1] -- ;
}
}
for ( int i = flag; i &lt; s.size() ; i ++ ) {
s[i] = '9';
}
return stoi(s);
}
};
</code></pre>
<p>草 真优雅</p>
<h1 id="968监控二叉树"><a class="header" href="#968监控二叉树">968.监控二叉树</a></h1>
<pre><code class="language-cpp">class Solution {
public:
int cnt = 0;
bool f(TreeNode*r) { // should not be null
// if(!r)return true;
if(!r-&gt;left&amp;&amp;!r-&gt;right)return false; // no monitor
bool lres = false;
if(r-&gt;left)res=f(r-&gt;left);
if(!res&amp;&amp;r-&gt;right)res=f(r-&gt;right);
if(res == true) return false;
else {
cnt ++ ;
return true;
}
}
int minCameraCover(TreeNode* r) {if(!r-&gt;left&amp;&amp;!r-&gt;right)return 1;
f(r);
return cnt;
}
};
</code></pre>
<p>想不明白:在二叉树中如何从低向上推导呢?</p>
<pre><code class="language-cpp">class Solution {
public:
int cnt = 0;
int f(TreeNode*p) {
// 0 -- 没有覆盖
// 1 -- 有覆盖了
// 2 -- 有摄像头
if(!p)return 1;
int l = f(p-&gt;left);
int r = f(p-&gt;right);
if (l==1 &amp;&amp; r==1) return 0;//////
if (l==0 || r==0) {//////////////
cnt ++ ;
return 2;
}
return 1;
}
int minCameraCover(TreeNode* r) {if(!r-&gt;left&amp;&amp;!r-&gt;right)return 1;
if(f(r)==0)cnt++;///////
return cnt;
}
};
</code></pre>
<p>[0,0,null,null,0,0,null,null,0,0]
0
0 n
n 0
0 n
n 0
0</p>

</main>

Expand Down
Loading

0 comments on commit 37fa1e0

Please sign in to comment.