C++の回転ソート配列IIで最小値を見つける
並べ替えられた配列があり、それがピボットで回転しているとします。ピボットはこれまで知られていません。その配列から最小要素を見つける必要があります。したがって、配列が[4,5,5,5,6,8,2,3,4]のような場合、最小要素は2です。
これを解決するには、次の手順に従います-
-
search()と呼ばれる1つのメソッドを定義します。これには、arr、low、highが必要です
-
low =highの場合、arr [low]
を返します -
中:=低+(高–低)/ 2
-
ans:=inf
-
arr [low]
-
それ以外の場合、arr [high]> arr [mid]の場合、ans:=arr [mid]の分とsearch(arr、low、mid)
-
それ以外の場合、arr [low] =arr [mid]の場合、ans:=arr [low]の最小値とsearch(arr、low + 1、high)
-
それ以外の場合、arr [high] =arr [mid]の場合、ans:=arr [high]の最小値とsearch(arr、low、high-1)
-
ansを返す
-
メインメソッドの呼び出しからsolve(nums、0、size of nums – 1)
例
理解を深めるために、次の実装を見てみましょう-
#include <bits/stdc++.h> using namespace std; class Solution { public: int search(vector <int>& arr, int low, int high){ if(low == high){ return arr[low]; } int mid = low + (high - low) / 2; int ans = INT_MAX; if(arr[low] < arr[mid]){ ans = min(arr[low], search(arr, mid, high)); } else if (arr[high] > arr[mid]){ ans = min(arr[mid], search(arr, low, mid)); } else if(arr[low] == arr[mid]){ ans = min(arr[low], search(arr, low + 1, high)); } else if(arr[high] == arr[mid]){ ans = min(arr[high], search(arr, low, high - 1)); } return ans; } int findMin(vector<int>& nums) { return search(nums, 0, nums.size() - 1); } }; main(){ Solution ob; vector<int> v = {4,5,5,5,6,8,2,3,4}; cout <<(ob.findMin(v)); }
入力
[4,5,5,5,6,8,2,3,4]
出力
2
-
C ++で(x%k)*(x / k)==nとなるような最小のxを見つけます
2つの正の整数nとkが与えられ、(x%k)*(x / k)がnと同じになるように、正の整数xを見つける必要があります。したがって、nとkがそれぞれ4と6の場合、出力は10になります。したがって、(10%6)*(10/6)=4です。 x%kの値は[1からk – 1]の範囲にあることがわかっているので(0は含まれません)ここで、nを除算する範囲で可能な整数を見つけるため、与えられた方程式は次のようになります。 * k)/(x%k)+(x%k) 例 #include<iostream> using namespace std; int minValue(int x, int y){ &
-
C++のRotatedSorted配列でRotationCountを検索します
回転してソートされた配列である配列があるとします。配列をソートするために必要な回転数を見つける必要があります。 (右から左への回転を検討します。) 配列が{15、17、1、2、6、11}のようであるとすると、配列を2回回転させて並べ替える必要があります。最終的な注文は{1、2、6、11、15、17}になります。ここでの出力は2です。 ロジックは単純です。気づいたら、回転数が最小要素のインデックスの値と同じであることがわかります。したがって、最小の要素を取得すると、そのインデックスが結果になります。 例 #include <iostream> using namespace st