C++でサブ配列が山の形であるかどうかを確認します
この問題では、整数の配列arr[]と範囲が与えられます。私たちの仕事は、サブアレイが山の形をしているかどうかを確認することです 。
問題を理解するために例を見てみましょう
Input : arr[] = {1, 4, 2, 5, 6, 7, 3, 0}, range = [2, 7] Output : Yes
説明 −
Subarray of range = {2, 5, 6, 7, 3, 0} The values first increase and then decrease.
ソリューションアプローチ
この問題の簡単な解決策は、追加のアレイを使用することです。配列の各要素に対して増加している最後の要素のインデックスを見つけ、値を減少させるために同じことを行います。次に、指定された時間内に山を確認します。
例
ソリューションの動作を説明するプログラム
#include <iostream> using namespace std; int processArray(int arr[], int N, int left[], int right[]){ left[0] = 0; int increasingValR = 0; for (int i = 1; i < N; i++){ if (arr[i] > arr[i - 1]) increasingValR = i; left[i] = increasingValR; } right[N - 1] = N - 1; int decreasingValL = N - 1; for (int i = N - 2; i >= 0; i--){ if (arr[i] > arr[i + 1]) decreasingValL = i; right[i] = decreasingValL; } } bool isMountainSubArray(int arr[], int left[], int right[], int L, int R){ return (right[L] >= left[R]); } int main(){ int arr[] = {2, 3, 2, 4, 4, 6, 3, 2}; int N = sizeof(arr) / sizeof(int); int left[N], right[N]; processArray(arr, N, left, right); int L = 0; int R = 2; if (isMountainSubArray(arr, left, right, L, R)) cout<<"The subarray is in mountain form"; else cout<<"The subarray is not in mountain form"; return 0; }
出力
The subarray is in mountain form
-
C++で厳密に増加するサブアレイの最大合計を見つける
n個の整数の配列があるとします。厳密に増加するサブ配列の最大合計を求めます。したがって、配列が[1、2、3、2、5、1、7]のような場合、合計は8になります。この配列には、厳密に増加する3つのサブ配列があります。これらは{1、2、3}、{2 、5}および{1、7}。最大合計サブ配列は{1、7}です。 この問題を解決するには、最大合計と現在の合計を追跡する必要があります。各要素arr[i]について、これがarr [i – 1]より大きい場合は、これを現在の合計に加算します。それ以外の場合、arr[i]は別のサブアレイの開始点です。したがって、現在の合計を配列として更新します。現在の合計を更新す
-
2つの特定のノード間にパスが存在するかどうかを確認するC++プログラム
これは、指定された2つのノード間にパスが存在するかどうかを確認するC++プログラムです アルゴリズム Begin function isReach() is a recursive function to check whether d is reachable to s: A) Mark all the vertices as unvisited. B) Mark the current node as visited and enqueue it and it will be used to get all ad