35. Search Insert Position
Description
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 must write an algorithm with O(log n) 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:
1 <= nums.length <= 104-104 <= nums[i] <= 104numscontains distinct values sorted in ascending order.-104 <= target <= 104
Solutions
Solution 1: Binary Search
Thinking
The first idea is to scan left to right until the first index \(\ge target\). Correct, and \(n \le 10^4\) would pass, but the array is strictly increasing, so a linear scan wastes the order.
The insertion point is exactly the first index not smaller than \(target\) — a standard lower bound.
Keep a half-open interval \([l,r)\): if \(nums[mid] \ge target\) the answer lies in the left half (including \(mid\)), otherwise it lies to the right of \(mid\). When \(l=r\), \(l\) is the insertion index.
Since the array \(nums\) is already sorted, we can use the binary search method to find the insertion position of the target value \(target\).
The time complexity is \(O(\log n)\), and the space complexity is \(O(1)\). Here, \(n\) is the length of the array \(nums\).
1 2 3 4 5 6 7 8 9 10 | |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 | |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 | |
1 2 3 4 5 6 7 8 9 10 11 12 | |
1 2 3 4 5 6 7 8 9 10 11 12 | |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 | |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 | |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 | |
Solution 2: Binary Search (Built-in Function)
Thinking
Method 1 is already \(O(\log n)\); what it still lacks is only that we need not write the binary search by hand. Languages already expose a lower bound: Python's bisect_left, C++'s lower_bound, Java's Arrays.binarySearch (returning \(-i-1\) when absent). The meaning matches Method 1; we just call the builtin.
We can also directly use the built-in function for binary search.
The time complexity is \(O(\log n)\), where \(n\) is the length of the array \(nums\). The space complexity is \(O(1)\).
1 2 3 | |
1 2 3 4 5 6 | |
1 2 3 4 5 6 | |
1 2 3 | |