【週刊】No.153

バスステーションとの間の距離C_01

でnは0からnまでのシーケンスにおけるリングバス路線上のステーション、 - 1は番号が付けられています。我々は、局の数およびIは、(i + 1)%N局間の距離である数を表す[I]に隣接するバス停の各対の間の距離を知って、距離。

リング上のバスは、時計回りと反時計回りの方向に移動することができます。

乗客は、宛先、宛先の間の最短距離から開始する出発点に戻ります。
ここに画像を挿入説明

输入:distance = [1,2,3,4], start = 0, destination = 3
输出:4
解释:公交站 03 之间的距离是 64,最小值是 4

方法:補完の方法

そして、アングルクロックが質問のクラスに自然を求めています。私たちは少し「日和見主義」を見なければなりませんので、それは、最短パスの内側の円形領域であるため、

  • 我々は、第1の和の合計長さを見つけ、DISに距離D Sを求めます。
  • 最後に、和DIS比較DISサイズをすることができます。
public int distanceBetweenBusStops(int[] distance, int start, int destination) {
  int s = Math.min(start, destination);
  int d = Math.max(start, destination);
  
  int sum = 0;
  for (int dis : distance)     
  	sum += dis;

  int dis = 0;
  for (int i = s; i < d; i++)  
  	dis += distance[i];
  
  return Math.min(sum-dis, dis);
}

複雑性分析

  • 時間計算: ザ・ ( n ) O(N)
  • 宇宙の複雑さ: O ( 1 ) O(1)

B_02一週間の最初の数日間

日付を考えると、その日のために対応する曜日を返します。

入力は、それぞれの日、月、年を表す3つの整数として与えられています。

{、「火曜日」、「月曜日」、「日曜日」「水曜日」、「木曜日」、「金曜日」、「土曜日」}次のいずれかの値として答えを返します。

Input: day = 31, month = 8, year = 2019
Output: "Saturday"

方法の一つ:API |ホイールを作成します

書かれています:https://blog.csdn.net/qq_43539599/article/details/103980460



最大のサブアレイされていると一度B_03削除します

整数の配列を考えると、最大で1つの要素の削除と空でない部分配列(連続する要素)の最大の合計を返します。言い換えれば、あなたは、サブアレーを選択し、必要に応じてそこに残された少なくとも一つの要素はまだあると残りの要素の合計が可能な最大となるように、そこから一つの要素を削除したいです。

部分配列は一つの要素を削除した後、空でないにする必要があることに注意してください。

Input: arr = [1,-2,0,3]
Output: 4
Explanation: Because we can choose [1, -2, 0, 3] and drop -2, 
thus the subarray [1, 0, 3] becomes the maximum value.

方法の一つ:DP

考え方に問題が購入するのに最適な時間と売り銘柄II 122ほとんどですが、毎日の株式を保有する必要があり、二つの状態の株式を保有していない、と毎日、前日との何らかの関係を持っています。これは、サイドドア、あなたがに関連付けるキーではありません。だからここにヒントがあります:

  • 何の削除が許可されていない場合はどのようにこの問題を解決するには?

  • 定義された状態
    • d p 0 [ 0... i ] DP0 [0 ... I] [I ... 0]サブアレイを選択表し、最大値が得られました。
    • d p 1 [ 0... i ] DP1 [0 ... I] 最も大きな最大サブ削除特定の素子アレイを示し、得られました。
  • 思考状態遷移方程式
    • d p 0 [ i ] = m a x ( d p 0 [ i 1 ] + a r r [ i ] , a r r [ i ] ) DP0 [I] = MAX(DP0 [I-1] + ARR [i]は、ARR [i])と 、得られた選択又は非選択サブアレイ最大電流要素を示します。
    • d p 1 [ i ] = m a x ( d p 1 [ i 1 ] + a r r [ i ] , d p 0 [ i 1 ] ) DP1 [I] = MAX(DP1 [I-1] + ARR [i]は、DP0 [I-1]) 、削除または電流を得られる最大のサブ配列要素を削除しないための手段が。
  • 初期化を考えます:
    • d p 0 [ 0 ] = a r r [ 0 ] DP0 [0] = ARR [0] iが0、のみ選択ARR [0]を示し=
    • d p 1 [ 0 ] = 1001 DP1 [0] = -1001 、I = 0の場合、デフォルトはARR [0]を選択されていない、ことを示しています
  • 出力を考えます m a x ( d p 0 [ 0... i ] , d p 1 [ 0... i ] ) MAX(DP0 [0 ... i]は、DP1 [0 ... I])
public int maximumSum(int[] arr) {
    int N = arr.length;
    
    int[] dp0 = new int[N];
    int[] dp1 = new int[N];
    dp0[0] = arr[0];
    dp1[0] = -1001;

    for (int i = 1; i < N; i++) {
        dp0[i] = Math.max(dp0[i-1] + arr[i], arr[i]);
        dp1[i] = Math.max(dp1[i-1] + arr[i], dp0[i-1]);
    }
    int max = Integer.MIN_VALUE;
    for (int i = 0; i < N; i++) {
        max = Math.max(max, Math.max(dp0[i], dp1[i]));
    }
    return max;
}

複雑性分析

  • 時間計算: O ( n ) O(N)
  • 宇宙の複雑さ: O ( n ) O(N)

A_04配列は、厳密に増加(しませんでした)

この方法の一つ:


複雑性分析

  • 時間計算: O ( ) ()
  • 宇宙の複雑さ: O ( ) ()

公開された495元の記事 ウォンの賞賛105 ・は 30000 +を見て

おすすめ

転載: blog.csdn.net/qq_43539599/article/details/104898320