【アルゴリズム叩き日記】day09——35.挿入位置探索、69.xの平方根

 35. 挿入位置の検索

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の平方根

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;
    }
};

 

おすすめ

転載: blog.csdn.net/m0_69061857/article/details/133465824