###### tags: `Week_1`, `Binary Search`
# Binary Search
## [704. Binary Search](https://leetcode.com/problems/binary-search/)
harry
```ruby=
# @param {Integer[]} nums
# @param {Integer} target
# @return {Integer}
def search(nums, target)
front = 0
back = nums.size - 1
loop do
mid = (front + back)/2
if nums[mid] == target
return mid
else
if front >= back
break
elsif target > nums[mid]
front = mid+1
else
back = mid-1
end
end
end
return -1
end
```
beny(t=n):
```csharp=
public class Solution {
public int Search(int[] nums, int target) {
for(int i = 0; i < nums.Count(); i++){
if(nums[i] == target){
return i;
}
}
return -1;
}
}
```
beny:
```csharp=
public class Solution {
public int Search(int[] nums, int target) {
int left = 0;
int right = nums.Length - 1;
while(left <= right){
int mid = (left + right) / 2;
if(nums[mid] > target){
right = mid - 1;
}else if(nums[mid] < target){
left = mid + 1;
}else{
return mid;
}
}
return -1;
}
}
```
Sam:
```python
class Solution:
def search(self, nums: List[int], target: int) -> int:
start = 0
end = len(nums) - 1
while start <= end:
mid = (start + end) // 2
if nums[mid] == target:
return mid
elif nums[mid] > target:
end = mid - 1
else:
start = mid + 1
return -1
```
## [278. First Bad Version](https://leetcode.com/problems/first-bad-version/)
harry
```ruby=
def first_bad_version(n)
front = 1
back = n
versions = {}
loop do
mid = (front + back)/2
bad = is_bad_version(mid)
versions[mid] = bad
if front >= back
if versions[mid] == false
return mid+1
else
return mid
end
end
if bad
if versions[mid-1] == false
return mid
else
back = mid-1
end
else
front = mid+1
end
end
end
```
beny:
```csharp=
public class Solution : VersionControl {
public int FirstBadVersion(int n) {
int left = 1;
int right = n;
while (left < right){
int mid = left + (right - left) / 2;
if(!IsBadVersion(mid)){
left = mid + 1;
}else{
right = mid;
}
}
return left;
}
}
```
Sam:
```python
# The isBadVersion API is already defined for you.
# def isBadVersion(version: int) -> bool:
class Solution:
def firstBadVersion(self, n: int) -> int:
start = 1
end = n
if isBadVersion(1) is True:
return 1
temp_map = dict()
while start <= end:
mid = (start + end) // 2
if mid in temp_map:
if temp_map[mid] and not temp_map[mid-1]:
return mid
elif temp_map[mid] and temp_map[mid-1]:
end = mid - 1
else:
start = mid + 1
else:
temp_map[mid] = isBadVersion(mid)
temp_map[mid - 1] = isBadVersion(mid - 1)
```