C ++
 Computer >> コンピューター >  >> プログラミング >> C ++

C++で最大値が制限されているサブアレイの数


正の整数の配列Aがあり、2つの正の整数LとRも指定されているとします。 (連続した、空でない)サブ配列の数を見つけて、そのサブ配列の最大配列要素の値が少なくともL、最大でRになるようにする必要があります。したがって、A =[2,1,4,3]であり、 L=2およびR=3の場合、要件を満たすサブアレイが3つあるため、出力は3になります。つまり、これらは[2]、[2,1]、[3]です。

これを解決するには、次の手順に従います-

  • ret:=0、dp:=0、prev:=-1

  • 0からA–1のサイズまでの範囲のiの場合

    • A [i]0の場合、ret:=ret + dp

    • A [i]> Rの場合、prev:=iおよびdp:=0

    • それ以外の場合、A [i]>=LおよびA[i]<=Rの場合、dp:=i – prevおよびret:=ret + dp

  • retを返す

例(C ++)

理解を深めるために、次の実装を見てみましょう-

#include <bits/stdc++.h>
using namespace std;
class Solution {
   public:
   int numSubarrayBoundedMax(vector<int>& A, int L, int R) {
      int ret = 0;
      int dp = 0;
      int prev = -1;
      for(int i = 0; i < A.size(); i++){
         if(A[i] < L && i > 0){
            ret += dp;
         }
         if(A[i] > R){
            prev = i;
            dp = 0;
         }
         else if(A[i] >= L && A[i] <= R){
            dp = i - prev;
            ret += dp;
         }
      }
      return ret;
   }
};
main(){
   vector<int> v = {2,1,4,3};
   Solution ob;
   cout << (ob.numSubarrayBoundedMax(v, 2, 3));
}

入力

[2,1,4,3]
2
3

出力

3

  1. C++での1桁の数

    数nがあるとすると、n以下のすべての非負の数に現れる数字1の総数を数える必要があります。したがって、入力が15の場合、出力は8になります。これは、1を含む数値が[1,10,11,12,13,14,15]であるため、81が8つあるためです。 これを解決するには、次の手順に従います- ret:=0 i:=1を初期化する場合、i <=nの場合、i =i * 10 do − a:=n / i、b:=n mod i、x:=a mod 10 xが1と同じ場合、 ret =ret +(a / 10)* i +(b + 1) それ以外の場合、xが0と同じ場合、-

  2. C++でのK-連結の最大合計

    整数配列arrと1つの整数kがあるとすると、k回繰り返すことによって配列を変更する必要があります。したがって、arr =[1、2]およびk =3の場合、変更された配列は[1、2、1、2、1、2]になります。 次に、変更された配列で最大のサブ配列の合計を見つける必要があります。サブ配列の長さは0で、その場合の合計は0であることに注意してください。答えは非常に大きい可能性があるため、10 ^ 9+7を法とする答えを見つけます。 したがって、入力が[1、-2,1]のようで、k =5の場合、結果は2になります。 これを解決するには、次の手順に従います- getKadane()というメソッド