制約の下で配列の最後に到達するための最小ステップ
1 桁の数値を含む配列がある場合、最初のインデックスに立っていると仮定すると、最小限のステップ数を使用して配列の末尾に到達する必要があり、1 ステップで隣接するインデックスにジャンプしたり、同じ値を持つ位置にジャンプしたりできます。
言い換えると、インデックス i にある場合、arr[K] = arr[i] (arr[K] の値は arr[i] と同じ) となるように、1 ステップで arr[i-1]、arr[i+1]、または arr[K] に到達できます。
例:
Input : arr[] = {5 4 2 5 0} Output : 2 Explanation : Total 2 step required. We start from 5(0) in first step jump to next 5 and in second step we move to value 0 (End of arr[]). Input : arr[] = [0 1 2 3 4 5 6 7 5 4 3 6 0 1 2 3 4 5 7] Output : 5 Explanation : Total 5 step required. 0(0) -> 0(12) -> 6(11) -> 6(6) -> 7(7) -> (18) (inside parenthesis indices are shown) この問題は次を使用して解決できます BFS 。与えられた配列を、すべての頂点が前後の配列要素への 2 つのエッジと、同じ値を持つ配列要素へのさらに多くのエッジを持つ重み付けされていないグラフとみなすことができます。ここで、3 番目のタイプのエッジを高速に処理するために、10 を維持します。 ベクトル これには、0 ~ 9 の数字が存在するすべてのインデックスが格納されます。上記の例では、0 に対応するベクトルは、指定された配列内で 0 が発生した [0 12] 2 つのインデックスを格納します。
同じインデックスに複数回アクセスしないように、別のブール配列が使用されます。 BFS を使用しており、BFS はレベルごとに進行するため、最適な最小ステップが保証されます。
実装:
C++ // C++ program to find minimum jumps to reach end // of array #include using namespace std ; // Method returns minimum step to reach end of array int getMinStepToReachEnd ( int arr [] int N ) { // visit boolean array checks whether current index // is previously visited bool visit [ N ]; // distance array stores distance of current // index from starting index int distance [ N ]; // digit vector stores indices where a // particular number resides vector < int > digit [ 10 ]; // In starting all index are unvisited memset ( visit false sizeof ( visit )); // storing indices of each number in digit vector for ( int i = 1 ; i < N ; i ++ ) digit [ arr [ i ]]. push_back ( i ); // for starting index distance will be zero distance [ 0 ] = 0 ; visit [ 0 ] = true ; // Creating a queue and inserting index 0. queue < int > q ; q . push ( 0 ); // loop until queue in not empty while ( ! q . empty ()) { // Get an item from queue q. int idx = q . front (); q . pop (); // If we reached to last index break from loop if ( idx == N -1 ) break ; // Find value of dequeued index int d = arr [ idx ]; // looping for all indices with value as d. for ( int i = 0 ; i < digit [ d ]. size (); i ++ ) { int nextidx = digit [ d ][ i ]; if ( ! visit [ nextidx ]) { visit [ nextidx ] = true ; q . push ( nextidx ); // update the distance of this nextidx distance [ nextidx ] = distance [ idx ] + 1 ; } } // clear all indices for digit d because all // of them are processed digit [ d ]. clear (); // checking condition for previous index if ( idx -1 >= 0 && ! visit [ idx - 1 ]) { visit [ idx - 1 ] = true ; q . push ( idx - 1 ); distance [ idx - 1 ] = distance [ idx ] + 1 ; } // checking condition for next index if ( idx + 1 < N && ! visit [ idx + 1 ]) { visit [ idx + 1 ] = true ; q . push ( idx + 1 ); distance [ idx + 1 ] = distance [ idx ] + 1 ; } } // N-1th position has the final result return distance [ N - 1 ]; } // driver code to test above methods int main () { int arr [] = { 0 1 2 3 4 5 6 7 5 4 3 6 0 1 2 3 4 5 7 }; int N = sizeof ( arr ) / sizeof ( int ); cout < < getMinStepToReachEnd ( arr N ); return 0 ; }
Java // Java program to find minimum jumps // to reach end of array import java.util.* ; class GFG { // Method returns minimum step // to reach end of array static int getMinStepToReachEnd ( int arr [] int N ) { // visit boolean array checks whether // current index is previously visited boolean [] visit = new boolean [ N ] ; // distance array stores distance of // current index from starting index int [] distance = new int [ N ] ; // digit vector stores indices where a // particular number resides Vector < Integer > [] digit = new Vector [ 10 ] ; for ( int i = 0 ; i < 10 ; i ++ ) digit [ i ] = new Vector <> (); // In starting all index are unvisited for ( int i = 0 ; i < N ; i ++ ) visit [ i ] = false ; // storing indices of each number // in digit vector for ( int i = 1 ; i < N ; i ++ ) digit [ arr [ i ]] . add ( i ); // for starting index distance will be zero distance [ 0 ] = 0 ; visit [ 0 ] = true ; // Creating a queue and inserting index 0. Queue < Integer > q = new LinkedList <> (); q . add ( 0 ); // loop until queue in not empty while ( ! q . isEmpty ()) { // Get an item from queue q. int idx = q . peek (); q . remove (); // If we reached to last // index break from loop if ( idx == N - 1 ) break ; // Find value of dequeued index int d = arr [ idx ] ; // looping for all indices with value as d. for ( int i = 0 ; i < digit [ d ] . size (); i ++ ) { int nextidx = digit [ d ] . get ( i ); if ( ! visit [ nextidx ] ) { visit [ nextidx ] = true ; q . add ( nextidx ); // update the distance of this nextidx distance [ nextidx ] = distance [ idx ] + 1 ; } } // clear all indices for digit d // because all of them are processed digit [ d ] . clear (); // checking condition for previous index if ( idx - 1 >= 0 && ! visit [ idx - 1 ] ) { visit [ idx - 1 ] = true ; q . add ( idx - 1 ); distance [ idx - 1 ] = distance [ idx ] + 1 ; } // checking condition for next index if ( idx + 1 < N && ! visit [ idx + 1 ] ) { visit [ idx + 1 ] = true ; q . add ( idx + 1 ); distance [ idx + 1 ] = distance [ idx ] + 1 ; } } // N-1th position has the final result return distance [ N - 1 ] ; } // Driver Code public static void main ( String [] args ) { int arr [] = { 0 1 2 3 4 5 6 7 5 4 3 6 0 1 2 3 4 5 7 }; int N = arr . length ; System . out . println ( getMinStepToReachEnd ( arr N )); } } // This code is contributed by 29AjayKumar
Python3 # Python 3 program to find minimum jumps to reach end# of array # Method returns minimum step to reach end of array def getMinStepToReachEnd ( arr N ): # visit boolean array checks whether current index # is previously visited visit = [ False for i in range ( N )] # distance array stores distance of current # index from starting index distance = [ 0 for i in range ( N )] # digit vector stores indices where a # particular number resides digit = [[ 0 for i in range ( N )] for j in range ( 10 )] # storing indices of each number in digit vector for i in range ( 1 N ): digit [ arr [ i ]] . append ( i ) # for starting index distance will be zero distance [ 0 ] = 0 visit [ 0 ] = True # Creating a queue and inserting index 0. q = [] q . append ( 0 ) # loop until queue in not empty while ( len ( q ) > 0 ): # Get an item from queue q. idx = q [ 0 ] q . remove ( q [ 0 ]) # If we reached to last index break from loop if ( idx == N - 1 ): break # Find value of dequeued index d = arr [ idx ] # looping for all indices with value as d. for i in range ( len ( digit [ d ])): nextidx = digit [ d ][ i ] if ( visit [ nextidx ] == False ): visit [ nextidx ] = True q . append ( nextidx ) # update the distance of this nextidx distance [ nextidx ] = distance [ idx ] + 1 # clear all indices for digit d because all # of them are processed # checking condition for previous index if ( idx - 1 >= 0 and visit [ idx - 1 ] == False ): visit [ idx - 1 ] = True q . append ( idx - 1 ) distance [ idx - 1 ] = distance [ idx ] + 1 # checking condition for next index if ( idx + 1 < N and visit [ idx + 1 ] == False ): visit [ idx + 1 ] = True q . append ( idx + 1 ) distance [ idx + 1 ] = distance [ idx ] + 1 # N-1th position has the final result return distance [ N - 1 ] # driver code to test above methods if __name__ == '__main__' : arr = [ 0 1 2 3 4 5 6 7 5 4 3 6 0 1 2 3 4 5 7 ] N = len ( arr ) print ( getMinStepToReachEnd ( arr N )) # This code is contributed by # Surendra_Gangwar
C# // C# program to find minimum jumps // to reach end of array using System ; using System.Collections.Generic ; class GFG { // Method returns minimum step // to reach end of array static int getMinStepToReachEnd ( int [] arr int N ) { // visit boolean array checks whether // current index is previously visited bool [] visit = new bool [ N ]; // distance array stores distance of // current index from starting index int [] distance = new int [ N ]; // digit vector stores indices where a // particular number resides List < int > [] digit = new List < int > [ 10 ]; for ( int i = 0 ; i < 10 ; i ++ ) digit [ i ] = new List < int > (); // In starting all index are unvisited for ( int i = 0 ; i < N ; i ++ ) visit [ i ] = false ; // storing indices of each number // in digit vector for ( int i = 1 ; i < N ; i ++ ) digit [ arr [ i ]]. Add ( i ); // for starting index distance will be zero distance [ 0 ] = 0 ; visit [ 0 ] = true ; // Creating a queue and inserting index 0. Queue < int > q = new Queue < int > (); q . Enqueue ( 0 ); // loop until queue in not empty while ( q . Count != 0 ) { // Get an item from queue q. int idx = q . Peek (); q . Dequeue (); // If we reached to last // index break from loop if ( idx == N - 1 ) break ; // Find value of dequeued index int d = arr [ idx ]; // looping for all indices with value as d. for ( int i = 0 ; i < digit [ d ]. Count ; i ++ ) { int nextidx = digit [ d ][ i ]; if ( ! visit [ nextidx ]) { visit [ nextidx ] = true ; q . Enqueue ( nextidx ); // update the distance of this nextidx distance [ nextidx ] = distance [ idx ] + 1 ; } } // clear all indices for digit d // because all of them are processed digit [ d ]. Clear (); // checking condition for previous index if ( idx - 1 >= 0 && ! visit [ idx - 1 ]) { visit [ idx - 1 ] = true ; q . Enqueue ( idx - 1 ); distance [ idx - 1 ] = distance [ idx ] + 1 ; } // checking condition for next index if ( idx + 1 < N && ! visit [ idx + 1 ]) { visit [ idx + 1 ] = true ; q . Enqueue ( idx + 1 ); distance [ idx + 1 ] = distance [ idx ] + 1 ; } } // N-1th position has the final result return distance [ N - 1 ]; } // Driver Code public static void Main ( String [] args ) { int [] arr = { 0 1 2 3 4 5 6 7 5 4 3 6 0 1 2 3 4 5 7 }; int N = arr . Length ; Console . WriteLine ( getMinStepToReachEnd ( arr N )); } } // This code is contributed by PrinciRaj1992
JavaScript < script > // Javascript program to find minimum jumps // to reach end of array // Method returns minimum step // to reach end of array function getMinStepToReachEnd ( arr N ) { // visit boolean array checks whether // current index is previously visited let visit = new Array ( N ); // distance array stores distance of // current index from starting index let distance = new Array ( N ); // digit vector stores indices where a // particular number resides let digit = new Array ( 10 ); for ( let i = 0 ; i < 10 ; i ++ ) digit [ i ] = []; // In starting all index are unvisited for ( let i = 0 ; i < N ; i ++ ) visit [ i ] = false ; // storing indices of each number // in digit vector for ( let i = 1 ; i < N ; i ++ ) digit [ arr [ i ]]. push ( i ); // for starting index distance will be zero distance [ 0 ] = 0 ; visit [ 0 ] = true ; // Creating a queue and inserting index 0. let q = []; q . push ( 0 ); // loop until queue in not empty while ( q . length != 0 ) { // Get an item from queue q. let idx = q . shift (); // If we reached to last // index break from loop if ( idx == N - 1 ) break ; // Find value of dequeued index let d = arr [ idx ]; // looping for all indices with value as d. for ( let i = 0 ; i < digit [ d ]. length ; i ++ ) { let nextidx = digit [ d ][ i ]; if ( ! visit [ nextidx ]) { visit [ nextidx ] = true ; q . push ( nextidx ); // update the distance of this nextidx distance [ nextidx ] = distance [ idx ] + 1 ; } } // clear all indices for digit d // because all of them are processed digit [ d ] = []; // checking condition for previous index if ( idx - 1 >= 0 && ! visit [ idx - 1 ]) { visit [ idx - 1 ] = true ; q . push ( idx - 1 ); distance [ idx - 1 ] = distance [ idx ] + 1 ; } // checking condition for next index if ( idx + 1 < N && ! visit [ idx + 1 ]) { visit [ idx + 1 ] = true ; q . push ( idx + 1 ); distance [ idx + 1 ] = distance [ idx ] + 1 ; } } // N-1th position has the final result return distance [ N - 1 ]; } // Driver Code let arr = [ 0 1 2 3 4 5 6 7 5 4 3 6 0 1 2 3 4 5 7 ]; let N = arr . length ; document . write ( getMinStepToReachEnd ( arr N )); // This code is contributed by rag2127 < /script>
出力
5
時間計算量: O(N) ここで、N は配列内の要素の数です。
空間の複雑さ: O(N) ここで、N は配列内の要素の数です。サイズ N の距離および訪問配列と、配列のインデックスを格納するサイズ N のキューを使用しています。
クイズの作成