一緒に書く習慣を身につけましょう!「ナゲッツデイリーニュープラン・4月アップデートチャレンジ」に参加して13日目です。クリックしてイベントの詳細をご覧ください。
1.問題の説明
n
要素のソートされた(昇順の)整数配列 nums
とターゲット値 が与えられた 場合、ターゲット値が存在する場合は添え字を返し、そうでない場合は を 返すtarget
関数を検索に記述し ます。nums
target
-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.問題分析
この質問は、二分探索の実際の応用です。二分探索の場合、実際には中央に近づくプロセスです。検索シーケンスは順番になっている必要があります。順序が正しくない場合、二分探索を実行する方法はありません。
上に示したように、二分探索は一般的に次の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;
}
};
复制代码