# LC 35. Search Insert Position
### [Problem link](https://leetcode.com/problems/search-insert-position/)
###### tags: `leedcode` `python` `easy` `Binary Search`
Given a sorted array of distinct integers and a target value, return the index if the target is found. If not, return the index where it would be if it were inserted in order.
You mustwrite an algorithm with<code>O(log n)</code> runtime complexity.
**Example 1:**
```
Input: nums = [1,3,5,6], target = 5
Output: 2
```
**Example 2:**
```
Input: nums = [1,3,5,6], target = 2
Output: 1
```
**Example 3:**
```
Input: nums = [1,3,5,6], target = 7
Output: 4
```
**Constraints:**
- <code>1 <= nums.length <= 10<sup>4</sup></code>
- <code>-10<sup>4</sup> <= nums[i] <= 10<sup>4</sup></code>
- <code>nums</code> contains **distinct** values sorted in **ascending** order.
- <code>-10<sup>4</sup> <= target <= 10<sup>4</sup></code>
## Solution 1 - Binary Search
#### Python
```python=
class Solution:
def searchInsert(self, nums: List[int], target: int) -> int:
left, right = 0, len(nums) - 1
while left <= right:
mid = (left + right) // 2
if nums[mid] == target:
return mid
elif nums[mid] > target:
right = mid - 1
else:
left = mid + 1
return left
```
#### C++
```cpp=
class Solution {
public:
int searchInsert(vector<int>& nums, int target) {
int left = 0;
int right = nums.size() - 1;
while (left <= right) {
int mid = left + (right - left) / 2;
if (nums[mid] >= target) {
right = mid - 1;
} else {
left = mid + 1;
}
}
return left;
}
};
```
## Solution 2 - Binary Search
```python=
class Solution:
def searchInsert(self, nums: List[int], target: int) -> int:
left, right = 0, len(nums)
while left < right:
mid = (left + right) // 2
if nums[mid] == target:
return mid
elif nums[mid] > target:
right = mid
else:
left = mid + 1
return left
```
>### Complexity
>n = nums.length
>| | Time Complexity | Space Complexity |
>| ----------- | --------------- | ---------------- |
>| Solution 1 | O(logn) | O(1) |
>| Solution 2 | O(logn) | O(1) |
## Note
sol1, 2:
```python=
兩種sol主要差在以下3點
1.
sol1: left, right = 0, len(nums) - 1
sol2: left, right = 0, len(nums)
2.
sol1: while left <= right:
sol2: while left < right:
3.
sol1: right = mid - 1
sol2: right = mid
記法很簡單, 都長跟都短, sol1 code的長度永遠都會比sol2要多一些.
兩種方法記起來就可以處理99%的題目了.
```
[詳細解說](https://github.com/youngyangyang04/leetcode-master/blob/master/problems/0035.%E6%90%9C%E7%B4%A2%E6%8F%92%E5%85%A5%E4%BD%8D%E7%BD%AE.md)