??xml version="1.0" encoding="utf-8" standalone="yes"?>在线电影av,国模精品视频一区二区,日本视频在线观看一区二区三区 http://www.aygfsteel.com/sandy/archive/2013/05/22/399605.htmlWed, 22 May 2013 14:25:00 GMThttp://www.aygfsteel.com/sandy/archive/2013/05/22/399605.htmlhttp://www.aygfsteel.com/sandy/comments/399605.htmlhttp://www.aygfsteel.com/sandy/archive/2013/05/22/399605.html#Feedback0http://www.aygfsteel.com/sandy/comments/commentRss/399605.htmlhttp://www.aygfsteel.com/sandy/services/trackbacks/399605.html
Problem

Given a string s1, we may represent it as a binary tree by partitioning it to two non-empty substrings recursively.
Below is one possible representation of s1 = "great":
    great
   /    \
  gr    eat
 / \    /  \
g   r  e   at
           / \
          a   t
To scramble the string, we may choose any non-leaf node and swap its two children.
For example, if we choose the node "gr" and swap its two children, it produces a scrambled string "rgeat".
    rgeat
   /    \
  rg    eat
 / \    /  \
r   g  e   at
           / \
          a   t
We say that "rgeat" is a scrambled string of "great".
Similarly, if we continue to swap the children of nodes "eat" and "at", it produces a scrambled string "rgtae".
    rgtae
   /    \
  rg    tae
 / \    /  \
r   g  ta  e
       / \
      t   a
We say that "rgtae" is a scrambled string of "great".
Given two strings s1 and s2 of the same length, determine if s2 is a scrambled string of s1.

 


分析Q?br />
q个问题是google的面试题。由于一个字W串有很多种二叉表示法,貌似很难判断两个字符串是否可以做q样的变换?br />对付复杂问题的方法是从简单的特例来思考,从而找律?br />先考察单情况:
字符串长度ؓ1Q很明显Q两个字W串必须完全相同才可以?br />字符串长度ؓ2Q当s1="ab", s2只有"ab"或?ba"才可以?br />对于L长度的字W串Q我们可以把字符串s1分ؓa1,b1两个部分Qs2分ؓa2,b2两个部分Q满I(a1~a2) && (b1~b2)Q或?nbsp;Q?a1~b2) && (a1~b2)Q?br />
如此Q我们找C解决问题的思\。首先我们尝试用递归来写?br />

解法一Q递归Q?br />
两个字符串的怼的必备条件是含有相同的字W集。简单的做法是把两个字符串的字符排序后,然后比较是否相同?br />加上q个查就可以大大的减递归ơ数?br />代码如下Q?br />
public boolean isScramble(String s1, String s2) {
        int l1 = s1.length();
        int l2 = s2.length();
        if(l1!=l2){
            return false;
        }
        if(l1==0){
            return true;
        }
        
        char[] c1 = s1.toCharArray();
        char[] c2 = s2.toCharArray();
        if(l1==1){
            return c1[0]==c2[0];
        }
        Arrays.sort(c1);
        Arrays.sort(c2);
        for(int i=0;i<l1;++i){
            if(c1[i]!=c2[i]){
                return false;
            }
        }
        
        boolean result = false;
        for(int i=1;i<l1 && !result;++i){
            String s11 = s1.substring(0,i);
            String s12 = s1.substring(i);
            String s21 = s2.substring(0,i);
            String s22 = s2.substring(i);
            result = isScramble(s11,s21) && isScramble(s12,s22);
            if(!result){
                String s31 = s2.substring(0,l1-i);
                String s32 = s2.substring(l1-i);
                result = isScramble(s11,s32) && isScramble(s12,s31);
            }
        }
        
        return result;
    }

解法二(动态规划)
减少重复计算的方法就是动态规划。动态规划是一U神奇的法技术,不亲自去写,是很隑֮全掌握动态规划的?br />
q里我用了一个三l数lboolean result[len][len][len],其中W一lؓ子串的长度,W二lؓs1的v始烦引,W三lؓs2的v始烦引?br />result[k][i][j]表示s1[i...i+k]是否可以由s2[j...j+k]变化得来?br />
代码如下Q非常简z优:

public class Solution {
    public boolean isScramble(String s1, String s2) {
        int len = s1.length();
        if(len!=s2.length()){
            return false;
        }
        if(len==0){
            return true;
        }
        
        char[] c1 = s1.toCharArray();
        char[] c2 = s2.toCharArray();
        
        boolean[][][] result = new boolean[len][len][len];
        for(int i=0;i<len;++i){
            for(int j=0;j<len;++j){
                result[0][i][j] = (c1[i]==c2[j]);
            }
        }
        
        for(int k=2;k<=len;++k){
            for(int i=len-k;i>=0;--i){
              for(int j=len-k;j>=0;--j){
                  boolean r = false;
                  for(int m=1;m<k && !r;++m){
                      r = (result[m-1][i][j] && result[k-m-1][i+m][j+m]) || (result[m-1][i][j+k-m] && result[k-m-1][i+m][j]);
                  }
                  result[k-1][i][j] = r;
              }
            }
        }
        
        return result[len-1][0][0];
    }
}


2013-05-22 22:25 发表评论
]]>
Subsetshttp://www.aygfsteel.com/sandy/archive/2013/05/21/399521.htmlTue, 21 May 2013 14:50:00 GMThttp://www.aygfsteel.com/sandy/archive/2013/05/21/399521.htmlhttp://www.aygfsteel.com/sandy/comments/399521.htmlhttp://www.aygfsteel.com/sandy/archive/2013/05/21/399521.html#Feedback0http://www.aygfsteel.com/sandy/comments/commentRss/399521.htmlhttp://www.aygfsteel.com/sandy/services/trackbacks/399521.html
Problem

Given a collection of integers that might contain duplicates, S, return all possible subsets.

Note:

  • Elements in a subset must be in non-descending order.
  • The solution set must not contain duplicate subsets.

For example,
If S = [1,2,2], a solution is:

[   [2],   [1],   [1,2,2],   [2,2],   [1,2],   [] ] 

分析Q?br />因ؓ要求l果集是升序排列Q所以首先我们要Ҏl进行排序?br />
子集的长度可以从0到整个数l的长度。长度ؓn+1的子集可以由长度为n的子集再加上在之后的一个元素组成?br />
q里我用了三个技?br />1。用了一个index数组来记录每个子集的最大烦引,q样d新元素就很简单?br />2。用了两个变量start和end来记录上一个长度的子集在结果中的v始和l止位置?br />3。去重处理用了一个last变量记录前一ơ的|它的初始D为S[0]-1,q样׃证了和数l的M一个元素不同?br />
代码如下Q?br />
public class Solution {
    public ArrayList<ArrayList<Integer>> subsetsWithDup(int[] S) {
        Arrays.sort(S);
        
        ArrayList<ArrayList<Integer>> result = new ArrayList<ArrayList<Integer>>();
        ArrayList<Integer> indexs = new ArrayList<Integer>();
        result.add(new ArrayList<Integer>());
        indexs.add(-1);
        
        int slen = S.length;
        int start=0,end=0;
        for(int len=1;len<=slen;++len){
            int e = end;
            for(int i=start;i<=end;++i){
                ArrayList<Integer> ss = result.get(i);
                int index = indexs.get(i).intValue();
                int last = S[0]-1;
                for(int j = index+1;j<slen;++j){
                    int v = S[j];
                    if(v!=last){
                        ArrayList<Integer> newss = new ArrayList<Integer>(ss);
                        newss.add(v);
                        result.add(newss);
                        indexs.add(j);
                        ++e;
                        last = v;
                    }
                }
            }
            
            start = end+1;
            end = e;
        }
        return result;
    }
}


2013-05-21 22:50 发表评论
]]>
格雷?/title><link>http://www.aygfsteel.com/sandy/archive/2013/05/20/399526.html</link><dc:creator>明</dc:creator><author>明</author><pubDate>Mon, 20 May 2013 13:09:00 GMT</pubDate><guid>http://www.aygfsteel.com/sandy/archive/2013/05/20/399526.html</guid><wfw:comment>http://www.aygfsteel.com/sandy/comments/399526.html</wfw:comment><comments>http://www.aygfsteel.com/sandy/archive/2013/05/20/399526.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.aygfsteel.com/sandy/comments/commentRss/399526.html</wfw:commentRss><trackback:ping>http://www.aygfsteel.com/sandy/services/trackbacks/399526.html</trackback:ping><description><![CDATA[<div><fieldset><legend>问题</legend>格雷码是一个二q制的编码系l,盔R的两个数只有一位是不同的?br />l定一个非负的整数nQ代表了格雷码的位的L。输出格L的序列,q个序列必须?开始?br /><br />比如Q给定n=2,输出Q?Q?Q?Q?Q,格雷码是<br />0 Q?00<br />1 Q?01<br />3 Q?11<br />2 Q?10<br /><br />注:格雷码的序列q不是唯一Q比如n=2ӞQ?Q?Q?Q?Q也满条g?br /></fieldset><br /><br />分析Q?br />格雷码的序列中应包含2^n个数。这个问题初看v来不ҎQ我们要惛_一个生成方法?br /><br />对于n=2,序列是:<br />00Q?1Q?1Q?0<br />那对于n=3,如何利用n=2的序列呢Q一个方法是Q先在n=2的四个序列前?Q这其实是保持不变)Q然后再考虑把最高位变成1Q只需要把方向反过来就可以?br />000Q?01Q?11Q?10<br />100Q?01Q?11Q?10Q?gt; 110,111,101,100<br />把这两行合v来就可以得到新的序列?br /><br />想通了Q写代码很Ҏ了?br /><br /><div style="background-color:#eeeeee;font-size:13px;border:1px solid #CCCCCC;padding-right: 5px;padding-bottom: 4px;padding-left: 4px;padding-top: 4px;width: 98%;word-break:break-all"><!--<br /><br />Code highlighting produced by Actipro CodeHighlighter (freeware)<br />http://www.CodeHighlighter.com/<br /><br />--><span style="color: #0000FF; ">public</span> <span style="color: #0000FF; ">class</span> Solution {<br />    <span style="color: #0000FF; ">public</span> ArrayList<Integer> grayCode(<span style="color: #0000FF; ">int</span> n) {<br />        ArrayList<Integer> result = <span style="color: #0000FF; ">new</span> ArrayList<Integer>();<br />        result.add(0);<br />        <span style="color: #0000FF; ">if</span>(n>0){<br />            result.add(1);<br />        }<br />        <br />        <span style="color: #0000FF; ">int</span> mask = 1;<br />        <span style="color: #0000FF; ">for</span>(<span style="color: #0000FF; ">int</span> i=2;i<=n;++i){<br />            mask *= 2;<br />            <span style="color: #0000FF; ">for</span>(<span style="color: #0000FF; ">int</span> j=result.size()-1;j>=0;--j){<br />                <span style="color: #0000FF; ">int</span> v = result.get(j).intValue();<br />                v |= mask;<br />                result.add(v);<br />            }<br />        }<br />        <span style="color: #0000FF; ">return</span> result;<br />    }<br />}</div></div><img src ="http://www.aygfsteel.com/sandy/aggbug/399526.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.aygfsteel.com/sandy/" target="_blank">明</a> 2013-05-20 21:09 <a href="http://www.aygfsteel.com/sandy/archive/2013/05/20/399526.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>交叉字符?/title><link>http://www.aygfsteel.com/sandy/archive/2013/05/10/398754.html</link><dc:creator>明</dc:creator><author>明</author><pubDate>Fri, 10 May 2013 12:47:00 GMT</pubDate><guid>http://www.aygfsteel.com/sandy/archive/2013/05/10/398754.html</guid><wfw:comment>http://www.aygfsteel.com/sandy/comments/398754.html</wfw:comment><comments>http://www.aygfsteel.com/sandy/archive/2013/05/10/398754.html#Feedback</comments><slash:comments>4</slash:comments><wfw:commentRss>http://www.aygfsteel.com/sandy/comments/commentRss/398754.html</wfw:commentRss><trackback:ping>http://www.aygfsteel.com/sandy/services/trackbacks/398754.html</trackback:ping><description><![CDATA[<div><fieldset><legend>问题</legend>l定字符串s1,s2,s3,判断s3是否可以由s1和s2交叉l成得到?br /><br />例如Q?br /><br /><p style="margin: 0px 0px 20px; padding: 0px; border: 0px; outline: 0px; font-size: 13px; vertical-align: baseline; color: #222222; font-family: 'Helvetica Neue', arial, sans-serif; "><em style="margin: 0px; padding: 0px; border: 0px; outline: 0px; vertical-align: baseline; ">s1</em> = <code style="margin: 0px; padding: 1px 5px; border: 0px; outline: 0px; vertical-align: baseline; background-color: #eeeeee; font-family: Consolas, Menlo, Monaco, 'Lucida Console', 'Liberation Mono', 'DejaVu Sans Mono', 'Bitstream Vera Sans Mono', 'Courier New', monospace, serif; ">"aabcc"</code>,<br style="margin: 0px; " /><em style="margin: 0px; padding: 0px; border: 0px; outline: 0px; vertical-align: baseline; ">s2</em> = <code style="margin: 0px; padding: 1px 5px; border: 0px; outline: 0px; vertical-align: baseline; background-color: #eeeeee; font-family: Consolas, Menlo, Monaco, 'Lucida Console', 'Liberation Mono', 'DejaVu Sans Mono', 'Bitstream Vera Sans Mono', 'Courier New', monospace, serif; ">"dbbca"</code>,</p><p style="margin: 0px 0px 20px; padding: 0px; border: 0px; outline: 0px; font-size: 13px; vertical-align: baseline; color: #222222; font-family: 'Helvetica Neue', arial, sans-serif; ">When <em style="margin: 0px; padding: 0px; border: 0px; outline: 0px; vertical-align: baseline; ">s3</em> = <code style="margin: 0px; padding: 1px 5px; border: 0px; outline: 0px; vertical-align: baseline; background-color: #eeeeee; font-family: Consolas, Menlo, Monaco, 'Lucida Console', 'Liberation Mono', 'DejaVu Sans Mono', 'Bitstream Vera Sans Mono', 'Courier New', monospace, serif; ">"aadbbcbcac"</code>, return true.<br style="margin: 0px; " />When <em style="margin: 0px; padding: 0px; border: 0px; outline: 0px; vertical-align: baseline; ">s3</em> = <code style="margin: 0px; padding: 1px 5px; border: 0px; outline: 0px; vertical-align: baseline; background-color: #eeeeee; font-family: Consolas, Menlo, Monaco, 'Lucida Console', 'Liberation Mono', 'DejaVu Sans Mono', 'Bitstream Vera Sans Mono', 'Courier New', monospace, serif; ">"aadbbbaccc"</code>, return false.</p></fieldset><br />解法一Q(递归Q?br /><br />一个简单的xQ是遍历s3的每个字W,q个字符必须{于s1和s2的某个字W。如果都不相{,则返回false<br />我们使用3个变量i,j,k分别记录当前s1,s2,s3的字W位|?br />如果s3[k] = s1[i], i向后Ud一位。如果s3[k]=s2[j],j向后Ud一位?br />q个题目主要隑֜如果s1和s2的字W出现重复的时候,有两种情况Qi,j都可以向后一位?br />下面的算法在q种情况使用了递归Q很单的做法。但是效率非常差Q是指数复杂度的?br /><br /><div style="background-color:#eeeeee;font-size:13px;border:1px solid #CCCCCC;padding-right: 5px;padding-bottom: 4px;padding-left: 4px;padding-top: 4px;width: 98%;word-break:break-all"><!--<br /><br />Code highlighting produced by Actipro CodeHighlighter (freeware)<br />http://www.CodeHighlighter.com/<br /><br />--><span style="color: #0000FF; ">public</span> <span style="color: #0000FF; ">class</span> Solution {<br />    <span style="color: #0000FF; ">public</span> <span style="color: #0000FF; ">boolean</span> isInterleave(String s1, String s2, String s3) {<br />        <span style="color: #0000FF; ">int</span> l1 = s1.length();<br />        <span style="color: #0000FF; ">int</span> l2 = s2.length();<br />        <span style="color: #0000FF; ">int</span> l3 = s3.length();<br />        <br />        <span style="color: #0000FF; ">if</span>(l1+l2!=l3){<br />            <span style="color: #0000FF; ">return</span> <span style="color: #0000FF; ">false</span>;<br />        }<br />        <br />        <span style="color: #0000FF; ">char</span>[] c1 = s1.toCharArray();<br />        <span style="color: #0000FF; ">char</span>[] c2 = s2.toCharArray();<br />        <span style="color: #0000FF; ">char</span>[] c3 = s3.toCharArray();<br />        <br />        <span style="color: #0000FF; ">int</span> i=0,j=0;<br />        <span style="color: #0000FF; ">for</span>(<span style="color: #0000FF; ">int</span> k=0;k<l3;++k){<br />            <span style="color: #0000FF; ">char</span> c = c3[k];<br />            <span style="color: #0000FF; ">boolean</span> m1 = i<l1 && c==c1[i];<br />            <span style="color: #0000FF; ">boolean</span> m2 = j<l2 && c==c2[j];<br />            <span style="color: #0000FF; ">if</span>(!m1 && !m2){<br />                <span style="color: #0000FF; ">return</span> <span style="color: #0000FF; ">false</span>;<br />            }<br />            <span style="color: #0000FF; ">else</span> <span style="color: #0000FF; ">if</span>(m1 && m2){<br />                String news3 =  s3.substring(k+1);<br />                <span style="color: #0000FF; ">return</span> isInterleave(s1.substring(i+1),s2.substring(j),news3)<br />                                || isInterleave(s1.substring(i),s2.substring(j+1),news3);<br />            }<br />            <span style="color: #0000FF; ">else</span> <span style="color: #0000FF; ">if</span>(m1){<br />                ++i;<br />            }<br />            <span style="color: #0000FF; ">else</span>{<br />                ++j;<br />            }<br />        }<br />        <br />        <span style="color: #0000FF; ">return</span> <span style="color: #0000FF; ">true</span>;        <br />    }<br />}</div><br /><br />解法二:Q动态规划)<br />Z减少重复计算Q就要用动态规划来记录中间l果?br /><br />q里我用了一个二l数lresult[i][j]来表Cs1的前i个字W和s2的前j个字W是否能和s3的前i+j个字W匹配?br /><br />状态{ULE如下:<br />result[i,j] = (result[i-1,j] && s1[i] = s3[i+j])  || (result[i,j-1] && s2[j] = s3[i+j]);<br />其中0≤i≤len(s1) ,0≤j≤len(s2)</div><div><br />q样法复杂度就会下降到O(l1*l2)<br /></div><div><div style="background-color:#eeeeee;font-size:13px;border:1px solid #CCCCCC;padding-right: 5px;padding-bottom: 4px;padding-left: 4px;padding-top: 4px;width: 98%;word-break:break-all"><!--<br /><br />Code highlighting produced by Actipro CodeHighlighter (freeware)<br />http://www.CodeHighlighter.com/<br /><br />--><span style="color: #0000FF; ">public</span> <span style="color: #0000FF; ">class</span> Solution {<br />   <br /><span style="color: #0000FF; ">public</span> <span style="color: #0000FF; ">boolean</span> isInterleave(String s1, String s2, String s3) {<br />        <span style="color: #0000FF; ">int</span> l1 = s1.length();<br />        <span style="color: #0000FF; ">int</span> l2 = s2.length();<br />        <span style="color: #0000FF; ">int</span> l3 = s3.length();<br />       <br />        <span style="color: #0000FF; ">if</span>(l1+l2!=l3){<br />            <span style="color: #0000FF; ">return</span> <span style="color: #0000FF; ">false</span>;<br />        }<br />        <br />        <span style="color: #0000FF; ">char</span>[] c1 = s1.toCharArray();<br />        <span style="color: #0000FF; ">char</span>[] c2 = s2.toCharArray();<br />        <span style="color: #0000FF; ">char</span>[] c3 = s3.toCharArray();<br />        <br />        <span style="color: #0000FF; ">boolean</span>[][] result = <span style="color: #0000FF; ">new</span> <span style="color: #0000FF; ">boolean</span>[l1+1][l2+1];<br />        result[0][0] = <span style="color: #0000FF; ">true</span>;<br />        <br />        <span style="color: #0000FF; ">for</span>(<span style="color: #0000FF; ">int</span> i=0;i<l1;++i){<br />            <span style="color: #0000FF; ">if</span>(c1[i]==c3[i]){<br />                result[i+1][0] = <span style="color: #0000FF; ">true</span>;<br />            }<br />            <span style="color: #0000FF; ">else</span>{<br />                <span style="color: #0000FF; ">break</span>;<br />            }<br />        }<br />        <br />        <span style="color: #0000FF; ">for</span>(<span style="color: #0000FF; ">int</span> j=0;j<l2;++j){<br />            <span style="color: #0000FF; ">if</span>(c2[j]==c3[j]){<br />                result[0][j+1] = <span style="color: #0000FF; ">true</span>;<br />            }<br />            <span style="color: #0000FF; ">else</span>{<br />                <span style="color: #0000FF; ">break</span>;<br />            }<br />        }<br />        <br />        <br />        <span style="color: #0000FF; ">for</span>(<span style="color: #0000FF; ">int</span> i=1;i<=l1;++i){<br />            <span style="color: #0000FF; ">char</span> ci = c1[i-1];<br />            <span style="color: #0000FF; ">for</span>(<span style="color: #0000FF; ">int</span> j=1;j<=l2;++j){<br />                <span style="color: #0000FF; ">char</span> cj = c2[j-1];<br />                <span style="color: #0000FF; ">char</span> ck = c3[i+j-1];<br />                   result[i][j] = (result[i][j-1] && cj==ck) || (result[i-1][j] && ci==ck);<br />            }<br />        }<br />        <br />        <span style="color: #0000FF; ">return</span> result[l1][l2];<br />   }<br />}</div></div><img src ="http://www.aygfsteel.com/sandy/aggbug/398754.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.aygfsteel.com/sandy/" target="_blank">明</a> 2013-05-10 20:47 <a href="http://www.aygfsteel.com/sandy/archive/2013/05/10/398754.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>三个C?/title><link>http://www.aygfsteel.com/sandy/archive/2013/05/01/398604.html</link><dc:creator>明</dc:creator><author>明</author><pubDate>Wed, 01 May 2013 15:13:00 GMT</pubDate><guid>http://www.aygfsteel.com/sandy/archive/2013/05/01/398604.html</guid><wfw:comment>http://www.aygfsteel.com/sandy/comments/398604.html</wfw:comment><comments>http://www.aygfsteel.com/sandy/archive/2013/05/01/398604.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.aygfsteel.com/sandy/comments/commentRss/398604.html</wfw:commentRss><trackback:ping>http://www.aygfsteel.com/sandy/services/trackbacks/398604.html</trackback:ping><description><![CDATA[     摘要: l定一个由n个整数组成的数组SQ是否存在S中的三个数a,b,c使得 a+b+c=0?扑և所有的不重复的和ؓ0的三元组?<br> <br>注意Q?<br>1.三元l的整数按照升序排列 a<b<c <br>2.l出的结果中不能含有相同的三元组  <a href='http://www.aygfsteel.com/sandy/archive/2013/05/01/398604.html'>阅读全文</a><img src ="http://www.aygfsteel.com/sandy/aggbug/398604.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.aygfsteel.com/sandy/" target="_blank">明</a> 2013-05-01 23:13 <a href="http://www.aygfsteel.com/sandy/archive/2013/05/01/398604.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>子序列计?/title><link>http://www.aygfsteel.com/sandy/archive/2013/04/26/398467.html</link><dc:creator>明</dc:creator><author>明</author><pubDate>Fri, 26 Apr 2013 15:33:00 GMT</pubDate><guid>http://www.aygfsteel.com/sandy/archive/2013/04/26/398467.html</guid><wfw:comment>http://www.aygfsteel.com/sandy/comments/398467.html</wfw:comment><comments>http://www.aygfsteel.com/sandy/archive/2013/04/26/398467.html#Feedback</comments><slash:comments>1</slash:comments><wfw:commentRss>http://www.aygfsteel.com/sandy/comments/commentRss/398467.html</wfw:commentRss><trackback:ping>http://www.aygfsteel.com/sandy/services/trackbacks/398467.html</trackback:ping><description><![CDATA[     摘要: l定两个字符串S和TQ计S的子序列为T的个数?<br> <br>q里的字W串的子序列指的是删除字W串的几个字W(也可以不删)而得到的新的字符Ԍ但是不能改变字符的相对位|?<br> <br>比如“ACE”是“ABCDE”的子序列,但是“AEC”就不是?<br> <br>如果SQ“rabbbit?TQ“rabit”,?U不同的子序列ؓT的构成方法,那么l果应该q回3?nbsp; <a href='http://www.aygfsteel.com/sandy/archive/2013/04/26/398467.html'>阅读全文</a><img src ="http://www.aygfsteel.com/sandy/aggbug/398467.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.aygfsteel.com/sandy/" target="_blank">明</a> 2013-04-26 23:33 <a href="http://www.aygfsteel.com/sandy/archive/2013/04/26/398467.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>讄二叉树的next节点http://www.aygfsteel.com/sandy/archive/2013/04/26/398413.htmlFri, 26 Apr 2013 03:23:00 GMThttp://www.aygfsteel.com/sandy/archive/2013/04/26/398413.htmlhttp://www.aygfsteel.com/sandy/comments/398413.htmlhttp://www.aygfsteel.com/sandy/archive/2013/04/26/398413.html#Feedback0http://www.aygfsteel.com/sandy/comments/commentRss/398413.htmlhttp://www.aygfsteel.com/sandy/services/trackbacks/398413.html
问题l定一颗二叉树Q?br />
class TreeLinkNode {
  TreeLinkNode left;
  TreeLinkNode right;
  TreeLinkNode next;
}
要求把所有节点的next节点讄成它双的节点,如果没有双点,讄成空。初始状态,所有的next的指针均为null.

要求:你只能用常数的I间?br />
比如Q?br />
         1
       /  \
      2    3
     / \    \
    4   5    7
应该输出Q?br />
1 -> NULL
       /  \
      2 -> 3 -> NULL
     / \    \
    4-> 5 -> 7 -> NULL

分析Q?br />题目不难Q但是在面试Ӟ在有限的旉内,没有bug写出Q还是很考验功力的?br />
解决q个问题的思\是逐层扫描Q上一层设|好下一层的next关系Q在处理I指针的时候要格外心?br />代码如下Q有注释Q应该很Ҏ看懂Q?br />使用了三个指针:
node:当前节点
firstChild:下一层的W一个非I子节点
lastChild:下一层的最后一个待处理Q未讄next)的子节点

    public void connect(TreeLinkNode root) {
        TreeLinkNode node = root;
        TreeLinkNode firstChild = null;
        TreeLinkNode lastChild = null;
        
        while(node!=null){
            if(firstChild == null){ //记录W一个非I子节点
                firstChild = node.left!=null?node.left:node.right;
            }
            //讄子节点的next关系Q?U情?/span>
            if(node.left!=null && node.right!=null){ 
                if(lastChild!=null){
                    lastChild.next = node.left;
                }
                node.left.next = node.right;
                lastChild = node.right;
            }
            else if(node.left!=null){
                if(lastChild!=null){
                    lastChild.next = node.left;
                }
                lastChild = node.left;
            }
            else if(node.right!=null){
                if(lastChild!=null){
                    lastChild.next = node.right;
                }
                lastChild = node.right;
            }
            //讄下一个节点,如果本层已经遍历完毕Q移C一层的W一个子节点
            if(node.next!=null){
                node = node.next;
            }
            else{
                node = firstChild;
                firstChild = null;
                lastChild = null;
            }
        }
    }


2013-04-26 11:23 发表评论
]]>
最佳的股票买卖旉IIIhttp://www.aygfsteel.com/sandy/archive/2013/04/25/398406.htmlThu, 25 Apr 2013 14:22:00 GMThttp://www.aygfsteel.com/sandy/archive/2013/04/25/398406.htmlhttp://www.aygfsteel.com/sandy/comments/398406.htmlhttp://www.aygfsteel.com/sandy/archive/2013/04/25/398406.html#Feedback0http://www.aygfsteel.com/sandy/comments/commentRss/398406.htmlhttp://www.aygfsteel.com/sandy/services/trackbacks/398406.html问题假设你有一个数l包含了每天的股h|它的Wi个元素就是第i天的股票h?nbsp;

设计一个算法寻找最大的收益。你可以最多进行两ơ交易?br />注意Q你不能同时q行多次交易Q也是说你买股之前,必须卖掉手中股票?/span>

分析Q?br />q道题相比之前的两道题,隑ֺ提高了不?br />
因ؓ限制了只能交易两ơ,所以我们可以把n天分ZD,分别计算q两D늚最大收益,可以得C个最大收益。穷举所有这L分法Q就可以得到全局的最大收益?br />
Z提高效率Q这里用动态规划,x中间状态记录下来。用了两个数组profitsQnprofits分别记录?..i和i..n的最大收益?br />
代码如下Q?br />
public int maxProfit(int[] prices) {
        int days = prices.length;
        if(days<2){
            return 0;
        }
        int[] profits = new int[days];
        int min = prices[0];
        int max = min;
        for(int i=1;i<days;++i){
            int p = prices[i];
            if(min>p){
                max = min = p;
            }
            else if(max<p){
                max = p;
            }
            int profit = max - min;
            profits[i] = (profits[i-1]>profit)?profits[i-1]:profit;
        }
        
        int[] nprofits = new int[days];
        nprofits[days-1] = 0;
        max = min = prices[days-1];
        for(int i=days-2;i>=0;--i){
            int p = prices[i];
            if(min>p){
                min =p;
            }
            else if(max<p){
                max = min = p;
            }
            int profit = max - min;
            nprofits[i] = (nprofits[i+1]>profit)?nprofits[i+1]:profit;
        }
        
        int maxprofit = 0;
        
        for(int i=0;i<days;++i){
            int profit = profits[i]+nprofits[i];
            if(maxprofit<profit){
                maxprofit = profit;
            }
        }
        
        return maxprofit;        
    }


2013-04-25 22:22 发表评论
]]>
最佳的股票买卖旉IIhttp://www.aygfsteel.com/sandy/archive/2013/04/19/398104.htmlFri, 19 Apr 2013 13:50:00 GMThttp://www.aygfsteel.com/sandy/archive/2013/04/19/398104.htmlhttp://www.aygfsteel.com/sandy/comments/398104.htmlhttp://www.aygfsteel.com/sandy/archive/2013/04/19/398104.html#Feedback0http://www.aygfsteel.com/sandy/comments/commentRss/398104.htmlhttp://www.aygfsteel.com/sandy/services/trackbacks/398104.html
问题假设你有一个数l包含了每天的股h|它的Wi个元素就是第i天的股票h?br />
设计一个算法寻找最大的收益。你可以q行L多次交易。但是,你不能同时进行多ơ交易,也就是说你买股票之前Q必d掉手中股?/fieldset>
分析Qؓ了得到最大收益,必须在所有上升的曲线D늚开始点买入Q在最高点卖出。而在下降阶段不出手?br />


实现代码如下Q?br />
public class Solution {
    public int maxProfit(int[] prices) {
        int len = prices.length;
        if(len<2){
            return 0;
        }
        
        int min=0;
        int result = 0;
        boolean inBuy = false;
        for(int i=0;i<len-1;++i){
            int p = prices[i];
            int q = prices[i+1];
            if(!inBuy){
                if(q>p){
                    inBuy = true;
                    min=p ;
                }
            }
            else{
                if(q<p){
                    result += (p-min);
                    inBuy = false;
                }
            }
        }
        if(inBuy){
            result += ((prices[len-1])-min);
        }
        return result;
    }
}


2013-04-19 21:50 发表评论
]]>最佳的股票买卖旉http://www.aygfsteel.com/sandy/archive/2013/04/19/398087.htmlFri, 19 Apr 2013 07:03:00 GMThttp://www.aygfsteel.com/sandy/archive/2013/04/19/398087.htmlhttp://www.aygfsteel.com/sandy/comments/398087.htmlhttp://www.aygfsteel.com/sandy/archive/2013/04/19/398087.html#Feedback0http://www.aygfsteel.com/sandy/comments/commentRss/398087.htmlhttp://www.aygfsteel.com/sandy/services/trackbacks/398087.html
你只能进行一ơ交易(一ơ买q和一ơ卖出)Q设计一个算法求出最大的收益?nbsp; 阅读全文

2013-04-19 15:03 发表评论
]]>
վ֩ģ壺 | | | ϻ| | | | | ɽ| ɽ| | ƽ| | κ| | | ̨| | | | | | | ͺ| | տ| | | | ͤ| | ɽ| ӽ| | Ͽ| | | | | ̫| ̨|