35. 挿入位置の検索
トピックの説明:
ソートされた配列とターゲット値を指定すると、配列内でターゲット値を検索し、そのインデックスを返します。ターゲット値が配列内に存在しない場合は、その値が順番に挿入される位置を返します。
時間計算量が のアルゴリズムを使用する必要があります O(log n)
。
問題解決のアイデア:
この質問には 2 つの可能性があります。
- t(target) が配列内にある場合、その添え字を返します
- t が配列内にない場合は、それを挿入する位置の添え字を返します
配列は 2 つの領域と考えることができます。[配列<t][配列>=t]
これは 2 番目の配列 [array>=t] の最初の位置を見つけることになります。
左側のエンドポイントが必要かどうかという問題になります。
ループが終了すると、 left==right になりますが、このときの境界問題、つまり nums[left] と t の関係を考慮する必要があり、 nums[left] 未満の場合は、次の位置に戻ります。左。
解決策コード:
class Solution {
public:
int searchInsert(vector<int>& nums, int target) {
int left=0,right=nums.size()-1;
while(left<right)
{
int mid=left+(right-left)/2;
if(nums[mid]==target)return mid;
if(nums[mid]<target)left=mid+1;
if(nums[mid]>target)right=mid;
}
//此时left==right,考虑边界问题
if(nums[left]<target)return left+1;
return left;
}
};
69. xの平方根
トピックの説明:
負でない整数を指定すると 、 算術 平方根x
を計算して返します 。x
戻り値の型が整数であるため、 結果の整数部分 のみが保持され、小数部分は 四捨五入されます。
注:組み込みの指数関数や演算子、または などは pow(x, 0.5)
使用 できませんx ** 0.5
。
問題解決のアイデア:
この質問は、0 から x までの数値 mid を見つけることに変えることができます。mid の 2 乗は x に最も近いか、または x に等しい可能性があります。
0-x 配列を 2 つの部分に分割し、1 つの部分 [0, Mid] [mid+1, x] を作成すると、左の区間の右の端点を見つけることができます。
解決策コード:
class Solution {
public:
int mySqrt(int x) {
long long left=0,right=x;
while(left<right)
{
long long mid=left+(right-left+1)/2;
if(mid*mid<x) left=mid;
if(mid*mid==x)return mid;
if(mid*mid>x) right=mid-1;
}
return right;
}
};