アルゴリズムは毎日の練習に質問します---78日目:二分探索

一緒に書く習慣を身につけましょう!「ナゲッツデイリーニュープラン・4月アップデートチャレンジ」に参加して13日目です。クリックしてイベントの詳細をご覧ください

1.問題の説明

n 要素のソートされた(昇順の)整数配列 nums とターゲット値 が与えられた 場合、ターゲット値が存在する場合は添え字を返し、そうでない場合は  を 返すtarget  関数を検索に記述し ますnumstarget-1

トピックリンク:二分探索

第二に、主題の要件

例1

输入: nums = [-1,0,3,5,9,12], target = 9
输出: 4
解释: 9 出现在 nums 中并且下标为 4
复制代码

例2

输入: nums = [-1,0,3,5,9,12], target = 2
输出: -1
解释: 2 不存在 nums 中因此返回 -1
复制代码

訪問

1.二分查找
2.建议用时10~25min
复制代码

3.問題分析

この質問は、二分探索の実際の応用です。二分探索の場合、実際には中央に近づくプロセスです。検索シーケンスは順番になっている必要があります。順序が正しくない場合、二分探索を実行する方法はありません。

1.png

上に示したように、二分探索は一般的に次の5つのステップに分けられます。

  • 左右のポインタを設定します、l = 0、r = n-1
  • 真ん中の位置を見つける、mid = l +(rl)/ 2(这样写防止溢出)
  • nums[mid] == target その場所で添え字を返す
  • nums[mid] > target 次に、右のポインタが中央に移動します
  • nums[mid] < target 次に、左のポインタが中央に移動します

第四に、エンコーディングの実装

class Solution {
public:
    int search(vector<int>& nums, int target) {
        int l,r,n=nums.size(),mid;//设定左右指针
        l=0,r=n-1;
        while(l<=r)
        {
            mid=l+(r-l)/2;//找出中间位置
            if(nums[mid]==target)//成功找到,返回该位置下标
                return mid;
            if(nums[mid]>target)//右侧指针移到中间
                r=mid-1;
            if(nums[mid]<target)//左侧指针移到中间
                l=mid+1;
        }
        return -1;
    }
};
复制代码

5.テスト結果

2.png

3.png

おすすめ

転載: juejin.im/post/7085886232328306719