# LeetCode Easy 704. Binary Search
tags: leetcode
問題
整列された(降順に)$n$個の要素を持つ整数列
nums
とtarget
という値を与えられたとき,nums
にあるtarget
を探す関数を書け.もし
target
が存在するならそのインデックスを返し, そうでなければ-1
を返せ
アイデア
真ん中の要素と比較して, target
との大小によって左側か右側から探します
解法
left
,right
という変数で探索する配列の範囲を指定します- 探索する配列の中央
mid
を探索します- この要素が
target
と一致したらmid
を返します - この要素が
target
より小さければ, 真ん中より後にtarget
より大きい可能性のある数があるのでleft
にmid+1
を代入します - そうでなければ真ん中より前にあります
- この要素が
- 見つからなければ
-1
を返します
計算量
配列の要素数を$N$とします
- 時間計算量
- 探索する範囲は半々になっていくので$2^{x} = N$であり, $x = \log n$
- つまり, $O(\log n)$です
- 空間計算量
- 新たに変数は定数個なので$O(1)$です
C++
class Solution { public: int search(vector<int>& nums, int target){ if(nums.size() == 0) return -1; int left = 0, right = nums.size() - 1; while(left <= right){ int mid = left + (right - left) / 2; if(nums[mid] == target){ return mid; } else if(nums[mid] < target) { left = mid + 1; } else { right = mid - 1; } } return -1; } };