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

最大サイズのサブアレイの合計は、C++ではkに等しい


numsという配列とターゲット値kがあるとすると、合計がkになるサブ配列の最大長を見つける必要があります。存在しない場合は、代わりに0を返します。

したがって、入力がnums =[1、-1、5、-2、3]、k =3のようである場合、サブ配列[1、-1、5、-2]の合計は4になるため、出力は4になります。 3で、最長です。

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

  • ret:=0

  • 1つのマップを定義するm

  • n:=numsのサイズ

  • temp:=0、m [0]:=-1

  • 初期化i:=0の場合、i

    • temp:=temp + nums [i]

    • (temp --k)がmの場合、-

      • ret:=retとiの最大値--m[temp --k]

    • 温度がmでない場合、-

      • m [temp]:=i

  • retを返す

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

#include <bits/stdc++.h>
using namespace std;
class Solution {
public:
   int maxSubArrayLen(vector<int<& nums, int k) {
      int ret = 0;
      unordered_map <int, int> m;
      int n = nums.size();
      int temp = 0;
      m[0] = -1;
      for(int i = 0; i < n; i++){
         temp += nums[i];
         if(m.count(temp - k)){
            ret = max(ret, i - m[temp - k]);
         }
         if(!m.count(temp)){
            m[temp] = i;
         }
      }
      return ret;
   }
};
main(){
   Solution ob;
   vector<int< v = {1,-1,5,-2,3};
   cout << (ob.maxSubArrayLen(v, 3));
}

入力

[1,-1,5,-2,3], 3

出力

4

  1. 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++で分割統治法を使用した最大合計サブアレイ

    正の値と負の値を持つデータのリストが1つあるとします。合計が最大である連続するサブ配列の合計を見つける必要があります。リストに{-2、-5、6、-2、-3、1、5、-6}が含まれているとすると、最大サブ配列の合計は7になります。これは{6、-2、-3の合計です。 、1、5} この問題は、分割統治法を使用して解決します。手順は次のようになります- 手順 − アレイを2つの部分に分割します 次の3つの最大値を見つけます 左側のサブアレイの最大サブアレイ合計 右サブアレイの最大サブアレイ合計 サブアレイが中点を横切るようなサブアレイの最大合計 例 #include <iostr