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

C++でのパス合計IV


深さが5未満の二分木を表す整数のリストがあるとします。木の深さが5未満の場合、このツリーは3桁の整数のリストで表すことができます。このリストの整数ごとに-

  • 百の位は、このノードの深さD、1 <=D<=4を表します。

  • 十の位は、1から8の範囲に属するレベルでのこのノードの位置Pを表します。位置は完全な二分木の位置と同じです。

  • 単位の桁は、このノードの値V、0 <=V<=9を表すために使用されます。

根から葉に向かうすべての経路の合計を見つける必要があります。

したがって、入力が[113、215、221]の場合、出力は12になります。リストが表すツリーは

です。

C++でのパス合計IV

パスの合計は(3 + 5)+(3 + 1)=12です。

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

  • 1つのマップグラフを定義する

  • 関数dfs()を定義します。これにより、ノード、レベル、位置が取得され、合計で0で初期化されます。

  • isLeaf:=true

  • 初期化i:=0の場合、i<グラフのサイズ[レベル+1]の場合、更新(iを1増やします)、実行-

    • 1つのペアを定義しますtemp:=graph [level + 1、i]

    • temp.first / 2がposと同じ場合、-

      • isLeaf:=false

      • dfs(temp.second、level + 1、temp.first、sum + node)

  • isLeafがゼロ以外の場合、-

    • ret:=ret +(合計+ノード)

  • メインの方法から、次のようにします。

  • ret:=0

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

    • x:=nums [i]

    • val:=x mod 10

    • x:=x / 10

    • pos:=x mod 10

    • x:=x / 10

    • レベル:=x

    • グラフの最後に{(左に1シフト(レベル-1)回)、val}を挿入します[レベル]

  • dfs(graph [1、0] .second、1、graph [1、0] .first)

  • retを返す

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

#include <bits/stdc++.h>
using namespace std;
class Solution {
public:
   int ret;
   map <int, vector < pair <int, int> > > graph;
   void dfs(int node, int level, int pos, int sum = 0){
      bool isLeaf = true;
      for (int i = 0; i < graph[level + 1].size(); i++) {
         pair<int, int> temp = graph[level + 1][i];
         if (temp.first / 2 == pos) {
            isLeaf = false;
            dfs(temp.second, level + 1, temp.first, sum + node);
         }
      }
      if (isLeaf) {
         ret += (sum + node);
      }
   }
   int pathSum(vector<int>& nums) {
      ret = 0;
      for (int i = 0; i < nums.size(); i++) {
         int x = nums[i];
         int val = x % 10;
         x /= 10;
         int pos = x % 10;
         x /= 10;
         int level = x;
         graph[level].push_back({ (1 << (level - 1)) + pos - 1, val });
      }
      dfs(graph[1][0].second, 1, graph[1][0].first);
      return ret;
   }
};
main(){
   Solution ob;
   vector<int> v = {113,215,221};
   cout<<(ob.pathSum(v));
}

入力

{113,215,221}

出力

12

  1. C++でのパス合計III

    各ノードが整数キーを保持する二分木を与えたと仮定します。合計して特定の値になるパスを見つける必要があります。パスはルートからリーフまで開始する必要があります。合計が同じになるパスを見つける必要があります。 ツリーが[5,4,8,11、null、13,4,7,2、null、null、5,1]のようで、合計が22の場合、-になります。 パスは[[5,4,11,2]、[5,8,4,5]]です。 これを解決するには、次の手順に従います- この問題を解決するには、dfs関数を使用します。dfsはわずかに変更されています。これは次のように機能します。この関数は、ルート、合計、および1つの一時

  2. C ++の合計配列パズル?

    ここでは、配列に関連する1つの興味深い問題を確認します。 n個の要素を持つ配列があります。 n個の要素の別の配列を作成する必要があります。ただし、2番目の配列のi番目の位置は、i番目の要素を除く最初の配列のすべての要素の合計を保持します。そして、1つの制約は、この問題では減算演算子を使用できないことです。 減算演算を使用できれば、すべての要素の合計を取得し、最初の配列のi番目の要素を減算して、2番目の配列のi番目の場所に格納することで、この問題を簡単に解決できます。 ここでは、毎回要素を追加することでこれを解決し、0..n-1のiについては、位置iの要素を無視します。ポイントを得るためのア