4C++での合計
これを解決するには、次の手順に従います-
- 実際の合計は、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つ増やします
- arr [left] + arr [right] =targetの場合、
- その他
- 範囲内の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にコピーします
- 範囲内のiの場合、サイズ– k、
- 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]]
-
C++でのリスのシミュレーション
木、リス、そしていくつかのナッツがあります。位置は、2Dグリッドのセルで表されます。あなたの目標は、リスがすべてのナッツを集めて、それらを1つずつ木の下に置くための最小距離を見つけることです。リスは一度に最大で1つのナットしかとることができず、隣接するセルに向かって上下左右の4つの方向に移動できます。距離は移動回数で表されます。 したがって、入力が高さ:5幅:7木の位置:[2,2]リス:[4,4]ナッツ:[[3,0]、[2,5]]の場合、出力は12になります。 、 これを解決するには、次の手順に従います- 関数calc()を定義します。これには、x1、y1、x2、y2、が必要で
-
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