ソリューションのアイデアは、解決策は、暴力の使用かもしれませんが、時間の複雑さは、時間の複雑さはO(N)、それは推奨されませんされてより多くを費やし、Iダブルポインタ方式、すなわち、2つのヘッドとテールポインタ、ヘッドポインタである少ないテールポインタよりも、ヘッド・ポインタが終了後、ポインタの移動または移動された後に
コードは以下の通りです
パッケージcom.qyx.Treeを。 / ** *非負整数A1、A2 Nが与えられると、...、ポイント(iは、AI)各座標の数を表します。 垂直座標内の動画* n行は、私は2つのエンドポイントは、(i、AI)及び(I、0)は垂直線です。 *一緒に容器と、x軸の構成は水を収容できるように、2本のラインを見つけます。 注:あなたは、コンテナを傾けることができない、とnの値が2以上です。 * @author QYX * * / パブリック クラスMaxArea { // ブルート力 // これは、空間複雑性O(1)であり、時間の複雑さはO(N ^ 2)であり、 公共 INT maxArea01(INT []高さ) { int型 maxArea = 0 ; 以下のために(int型 ; I <height.length、私は0を= I ++ ) { 以下のための(int型 J = + 1; J <height.lengthあり、j ++ ) { maxArea = Math.max(maxArea、Math.min(身長[I]、高さ[J])*(J- I))。 } } 返すmaxAreaを。 } // ダブルポインタ方式(ダブルポイント) / * 空間の複雑さはO(1)であり、時間の複雑さはO(N)である* / パブリック INT maxArea02(INT []高さ) { INT maxArea = 0、L = 0、R = height.length-1 。 一方、(L < R) { maxArea = Math.max(maxArea、Math.min(高さ[L]、高さ[R])*(R- L))。 もし(高さ[L] < 高さ[R]) { L ++ ; } 他{ R - ; } } 返すmaxAreaを。 } }
2番目の質問
私は次のようにコードは、貪欲なアルゴリズムを使用しました
パッケージcom.qyx.Treeを。 輸入javax.management.relation.Role; / ** 次の7つを含む*ローマ数字文字:I、V、X、L、C、D及びM. 文字の値 I 1 5 V X 10 L 50 C 100 D 500 M 1000年 例えば、ローマ数字2 IIのように書く、X + IIである二つの平行1.12 XII、として書かなければなりません。図27は、XXVII、即ちXX + V + IIのように書きます。 一般的に、大量に右にローマ数字の数が少ないです。しかし、例外もある、例えば、4 IIIIを書きますが、IVはありません。左番号5番号1において、多数の数が4を得た少ない数5で表される値に等しいです。 同様に、数9は、IXで表されます。この特別なルールは以下の6つのケースにのみ適用されます。 私は、左V(5)とX(10)上にあってもよく、及び4,9を表現します。 X Lは、左(50)及びC(100)上に配置することができ、そして40と90が示されています。 Cは、400と900表すために、左側にD(500)とM(1000)上に配置することができます。 整数を考えると、ローマ数字に変換します。入力は3999から1の範囲にあることを保証します。 * @author QYX * */ public class LuMaNumberTransaction { //使用贪心算法进行整数转罗马数 public String IntTransationLuMaNumber(int num) { String str=""; //1000 100 10 1 500 50 5 char[] romes=new char[]{'M','C','X','I','D','L','V'}; int[] num_split=new int[4]; int count=3; while(count>=0) { //依次计算得出万位,千位,百位及个位,并将其存入数组 num_split[count]=num%10; num=num/10; count--; } for(int i=0;i<4;i++) { switch(num_split[i]) { case 4: str=str+romes[i]+romes[3+i]; break; case 9: str=str+romes[i]+romes[i-1]; break; default: if(num_split[i]<5) { for(int j=0;j<num_split[i];j++) { str=str+romes[i]; } }else{ str=str+romes[3+i]; for(int j=0;j<num_split[i]-5;j++) { str=str+romes[i]; } } } } return str; } public String IntTransactionLuMaNumber02(int num) { //准备接受字符串 String str=""; int count=3; int[] num_split=new int[4]; char[] cs=new char[]{'M','C','X','I','D','L','V'}; while(count>=0) { num_split[count]=num%10; num=num/10; count--; } for(int i=0;i<4;i++) { switch (num_split[i]) { case 4: str=str+cs[i]+cs[3+i]; break; case 9: str=str+cs[i]+cs[i-1]; default: if(num_split[i]<5) { for(int j=0;j<num_split[i];j++) { str=str+cs[i]; } }else{ //先加上5 str=str+cs[3+i]; for(int j=0;j<num_split[i]-5;j++)//因为前面已经加5了,所以这里要减5 { str=str+cs[i]; } } } } return str; } }