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

4C++での合計


数値の配列があるとします。これはn個の整数を格納し、配列には4つの要素a、b、c、およびdがあります。 a + b + c +d=ターゲットなどの別のターゲット値があります。状況を満たす配列内のすべての一意の4つ組を検索します。したがって、配列が[-1,0,1,2,0、-2]のようで、ターゲットが0の場合、結果は[[-1、0、0、1]、[-2、-1 1、2]、[-2、0、0、2]]

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

  • 実際の合計は、kSum()と呼ばれる関数を使用して実行されます。これには、配列、開始、k、およびターゲットが含まれます。最初に関数はk値4で呼び出されます。関数は次のようになります
  • 配列解像度を定義する
  • k =2の場合、
    • 左:=開始と右:=配列サイズ– 1
    • サイズ2の別のアレイ温度を定義します
    • 左<右
      • arr [left] + arr [right] =targetの場合、
        • temp [0]:=arr [left]、temp [1]:=arr [right]、およびtempをresに挿入
        • 左<右およびarr[左]=arr[左+1]
          • lを1増やします
        • 左<右およびarr[右]=arr [右– 1]
          • rを1減らします
        • lを1増やし、rを1減らします
      • それ以外の場合、arr [left] + arr [right]>ターゲットの場合、右に1減少します
      • それ以外の場合は、左に1つ増やします
  • その他
    • 範囲内のiの場合、サイズ– k、
      • i>が開始してarr[i]=arr [i-1]の場合、次の手順をスキップして続行します
      • 1つの2次元配列tempを定義します:=kSum(arr、i + 1、k – 1、target – arr [i])
      • 0からtempの範囲のjの場合
        • temp [j]
        • の後にarr[i]を挿入します
      • tempのすべての要素をresにコピーします
  • return res

例(C ++)

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

#include <bits/stdc++.h>
using namespace std;
void print_vector(vector<vector<int> > v){
   cout << "[";
   for(int i = 0; i<v.size(); i++){
      cout << "[";
      for(int j = 0; j <v[i].size(); j++){
         cout << v[i][j] << ", ";
      }
      cout << "],";
   }
   cout << "]"<<endl;
}
class Solution {
public:
   void addAll(vector < vector <int> >& res, vector < vector <int> >& temp){
      for(int i = 0; i < temp.size(); i++)res.push_back(temp[i]);
   }
   vector<vector<int>> fourSum(vector<int>& nums, int target) {
      sort(nums.begin(), nums.end());
      return kSum(nums, 0, 4, target);
   }
   vector < vector <int> > kSum(vector <int>& arr, int start, int k, int target){
      vector < vector <int> > res;
      if(k == 2){
         int left = start;
         int right = arr.size() - 1;
         vector <int> temp(2);
         while(left < right){
            if(arr[left] + arr[right] == target){
               temp[0] = arr[left];
               temp[1] = arr[right];
               res.push_back(temp);
               while(left < right && arr[left] == arr[left + 1])left++;
               while(left < right && arr[right] == arr[right - 1])right--;
               left++;
               right--;
            }
            else if(arr[left] + arr[right] > target)right--;
            else left ++;
         }
      }
      else{
         for(int i = start; i < (int)arr.size() - k + 1; i++){
            if(i > start && arr[i] == arr[i - 1])continue;
            vector < vector <int> > temp = kSum(arr, i + 1, k - 1, target - arr[i]);
            for(int j = 0; j < temp.size(); j++){
               temp[j].push_back(arr[i]);
            }
            addAll(res, temp);
         }
      }
      return res;
   }
};
main(){
   Solution ob;
   vector<int> v = {1,0,-1,0,-2,2};
   print_vector(ob.fourSum(v, 0));
}

入力

[1,0,-1,0,-2,2]
0

出力

[[1,2,-1,-2],[0,2,0,-2],[0,1,0,-1]]

  1. C++でのリスのシミュレーション

    木、リス、そしていくつかのナッツがあります。位置は、2Dグリッドのセルで表されます。あなたの目標は、リスがすべてのナッツを集めて、それらを1つずつ木の下に置くための最小距離を見つけることです。リスは一度に最大で1つのナットしかとることができず、隣接するセルに向かって上下左右の4つの方向に移動できます。距離は移動回数で表されます。 したがって、入力が高さ:5幅:7木の位置:[2,2]リス:[4,4]ナッツ:[[3,0]、[2,5]]の場合、出力は12になります。 、 これを解決するには、次の手順に従います- 関数calc()を定義します。これには、x1、y1、x2、y2、が必要で

  2. C++の長方形エリアII

    (軸に沿った)長方形のリストがあるとします。ここで、各rectangle [i] ={x1、y1、x2、y2}です。ここで、(x1、y1)は左下隅のポイントであり、(x2、y2)は右上隅のポイントです。 i番目の長方形。 平面内のすべての長方形でカバーされる総面積を見つける必要があります。答えは非常に大きい可能性があるため、モジュロ10 ^ 9+7を使用できます。 したがって、入力が次のような場合 その場合、出力は6になります。 これを解決するには、次の手順に従います- m =10 ^ 9 + 7 関数add()を定義します。これには、a、b、が必要です。 r