linxuesong

<!DOCTYPE html> <html lang="zh"> <head> <meta charset="utf-8"/> <title>Markdown在线编辑器 - www.MdEditor.com</title> <link rel="shortcut icon" href="https://www.mdeditor.com/images/logos/favicon.ico" type="image/x-icon"/> </head> <body><h1 id="h1-u9898u76EE"><a name="题目" class="reference-link"></a><span class="header-link octicon octicon-link"></span>题目</h1><p>HZ偶尔会拿些专业问题来忽悠那些非计算机专业的同学。今天测试组开完会后,他又发话了:在古老的一维模式识别中,常常需要计算连续子向量的最大和,当向量全为正数的时候,问题很好解决。但是,如果向量中包含负数,是否应该包含某个负数,并期望旁边的正数会弥补它呢?例如:{6,-3,-2,7,-15,1,2,2},连续子向量的最大和为8(从第0个开始,到第3个为止)。给一个数组,返回它的最大连续子序列的和,你会不会被他忽悠住?(子向量的长度至少是1)</p> <h1 id="h1-u601Du8DEFu4E00"><a name="思路一" class="reference-link"></a><span class="header-link octicon octicon-link"></span>思路一</h1><p>暴力搜索的话n+n-1+n-2+..+1 种<br>以第i做起始,往后延续了几个元素 ,时间复杂度(n*n) 空间复杂度(1)保存一个最大值<br>例如: 1 2 情况有三1;1 2;2; </p><h1 id="h1-u601Du8DEFu4E8C"><a name="思路二" class="reference-link"></a><span class="header-link octicon octicon-link"></span>思路二</h1><p>这个典型的大问题换小问题(分治法递归或者动态规划)</p> <h3 id="h3-u5148u627Eu9012u5F52u5F0F"><a name="先找递归式" class="reference-link"></a><span class="header-link octicon octicon-link"></span>先找递归式</h3><h5 id="h5-u9012u5F52u5F0Fu4E00"><a name="递归式一" class="reference-link"></a><span class="header-link octicon octicon-link"></span>递归式一</h5><p>前n个元素连续子向量的最大和 = MAX(前n-1元素连续子向量最大和,以n结尾的所有情况)<br>如大问题 1 -2 10 ; 小问题 1 -2 小问题的解 最大值1 只取第一个元素;<br>根据小问题的状态,我们要搜索以10结尾的所有情况 (1 -2 10) (-2 10) (10);其结果和 小问题的解 1 去比较得到 最大为10(需要考虑n种情况) </p><h5 id="h5-u9012u5F52u5F0Fu4E8C"><a name="递归式二" class="reference-link"></a><span class="header-link octicon octicon-link"></span>递归式二</h5><p>以第i+1个元素结尾的最大连续子向量的值 = MAX(以第i个元素结尾的最大连续子向量的值, 以第i个元素结尾的最大连续子向量的值+第i+1个元素的值)<br>最后得到n个值,然后去最大的,就是结果<br>如1 -2 10,小问题以-2 结尾的最大值 (1 -2)=-1 ,大问题以10为结尾的最大值比较(以10的上上一个元素结尾的最大值-1+10) (10);结果为10<br>(仅两种情况且不需要保存一个之前选取的那些元素的数组) </p><h3 id="h3-u6839u636Eu9012u5F52u5F0Fu5199u4EE3u7801"><a name="根据递归式写代码" class="reference-link"></a><span class="header-link octicon octicon-link"></span>根据递归式写代码</h3><pre class="prettyprint linenums prettyprinted" style=""><ol class="linenums"><li class="L0"><code class="lang-html"><span class="pln">class Solution {</span></code></li><li class="L1"><code class="lang-html"><span class="pln">public:</span></code></li><li class="L2"><code class="lang-html"><span class="pln"> int Max(int a, int b) {</span></code></li><li class="L3"><code class="lang-html"><span class="pln"> return a &gt; b ? a :b ;</span></code></li><li class="L4"><code class="lang-html"><span class="pln"> }</span></code></li><li class="L5"><code class="lang-html"><span class="pln"> int FindGreatestSumOfSubArray(vector</span><span class="tag">&lt;int&gt;</span><span class="pln"> array) {</span></code></li><li class="L6"><code class="lang-html"><span class="pln"> int len = array.size();</span></code></li><li class="L7"><code class="lang-html"><span class="pln"> if(len == 0) {</span></code></li><li class="L8"><code class="lang-html"><span class="pln"> return 0;</span></code></li><li class="L9"><code class="lang-html"><span class="pln"> }</span></code></li><li class="L0"><code class="lang-html"><span class="pln"> int result[len] ; // 每个问题(以第i元素结尾的最大子向量)的解</span></code></li><li class="L1"><code class="lang-html"><span class="pln"> result[0] = array[0];</span></code></li><li class="L2"><code class="lang-html"><span class="pln"> for(int i = 1;i &lt; len; i++) {</span></code></li><li class="L3"><code class="lang-html"><span class="pln"> result[i] = Max(result[i-1] + array[i], array[i] );</span></code></li><li class="L4"><code class="lang-html"><span class="pln"> }</span></code></li><li class="L5"><code class="lang-html"><span class="pln"> int max = result[0];</span></code></li><li class="L6"><code class="lang-html"><span class="pln"> for(int i= 1; i &lt; len; i++) {</span></code></li><li class="L7"><code class="lang-html"><span class="pln"> max = Max(max, result[i]);</span></code></li><li class="L8"><code class="lang-html"><span class="pln"> }</span></code></li><li class="L9"><code class="lang-html"><span class="pln"> return max;</span></code></li><li class="L0"><code class="lang-html"><span class="pln"> }</span></code></li><li class="L1"><code class="lang-html"><span class="pln">};</span></code></li></ol></pre> <p>```</p> <h3 id="h3-end"><a name="End" class="reference-link"></a><span class="header-link octicon octicon-link"></span>End</h3></body> </html>

分类:

技术点:

相关文章: