notes/OJ notes/pages/Leetcode Search-Insert-Position.md

107 lines
2 KiB
Markdown
Raw Normal View History

2022-07-10 08:29:59 +08:00
# Leetcode Search-Insert-Position
#### 2022-07-09 10:25
> ##### Algorithms:
2022-09-03 15:41:36 +08:00
>
> #algorithm #binary_search
>
2022-07-10 08:29:59 +08:00
> ##### Data structures:
2022-09-03 15:41:36 +08:00
>
> #DS #array
>
2022-07-10 08:29:59 +08:00
> ##### Difficulty:
2022-09-03 15:41:36 +08:00
>
2022-09-06 20:22:48 +08:00
> #coding_problem #difficulty_easy
2022-09-03 15:41:36 +08:00
>
2022-07-10 08:29:59 +08:00
> ##### Additional tags:
2022-09-03 15:41:36 +08:00
>
2022-07-10 08:29:59 +08:00
> #leetcode
2022-09-03 15:41:36 +08:00
>
2022-07-10 08:29:59 +08:00
> ##### Revisions:
2022-09-03 15:41:36 +08:00
>
2022-07-10 08:29:59 +08:00
> N/A
##### Related topics:
2022-09-03 15:41:36 +08:00
2022-07-10 08:29:59 +08:00
##### Links:
2022-09-03 15:41:36 +08:00
2022-07-10 08:29:59 +08:00
- [Link to problem](https://leetcode.com/problems/binary-search/)
2022-09-03 15:41:36 +08:00
---
2022-07-10 08:29:59 +08:00
### Problem
Given an array of integers `nums` which is sorted in ascending order, and an integer `target`, write a function to search `target` in `nums`. If `target` exists, then return its index. Otherwise, return `-1`.
You must write an algorithm with `O(log n)` runtime complexity.
#### Examples
**Example 1:**
**Input:** nums = [-1,0,3,5,9,12], target = 9
**Output:** 4
**Explanation:** 9 exists in nums and its index is 4
**Example 2:**
**Input:** nums = [-1,0,3,5,9,12], target = 2
**Output:** -1
**Explanation:** 2 does not exist in nums so return -1
#### Constraints
2022-09-03 15:41:36 +08:00
- `1 <= nums.length <= 104`
- `-104 < nums[i], target < 104`
- All the integers in `nums` are **unique**.
- `nums` is sorted in ascending order.
2022-07-10 08:29:59 +08:00
### Thoughts
> [!summary]
> This is a #binary_search problem.
similar to [[Leetcode First-Bad-Version]], this relies on the converging nature of Bi-search
if the value is found, simply return it
if not found, at the end, position `l - 1` should be smaller than val.
and position `l` should be bigger, which is the position for the answer:
2022-09-03 15:41:36 +08:00
2022-07-10 08:29:59 +08:00
```
If not, return the index where it would be if it were inserted in order.
```
### Solution
Iteration
2022-09-03 15:41:36 +08:00
2022-07-10 08:29:59 +08:00
```cpp
class Solution {
public:
int searchInsert(vector<int>& nums, int target) {
// variant of bi-search
int r = nums.size() - 1;
int l = 0;
int mid, val;
2022-09-03 15:41:36 +08:00
2022-07-10 08:29:59 +08:00
do {
mid = l + (r - l) / 2;
val = nums[mid];
2022-09-03 15:41:36 +08:00
2022-07-10 08:29:59 +08:00
if (val == target) {
return mid;
} else if (val < target) {
l = mid + 1;
} else {
r = mid - 1;
}
} while (l <= r);
2022-09-03 15:41:36 +08:00
2022-07-10 08:29:59 +08:00
return l;
}
};
2022-09-03 15:41:36 +08:00
```