0035 - Search Insert Position (Easy)
Problem Link
https://leetcode.com/problems/search-insert-position/
Problem Statement
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 <= 10^4
-10^4 <= nums[i] <= 10^4
nums
contains distinct values sorted in ascending order.-10^4 <= target <= 10^4
Approach 1: Built-in Function
We can use STL to get the answer. lower_bound returns the first element which has a value not less than target. We need to subtract nums.begin()
to get the index.
- C++
- Python
class Solution {
public:
int searchInsert(vector<int>& nums, int target) {
return lower_bound(nums.begin(), nums.end(), target) - nums.begin();
}
};
class Solution:
def searchInsert(self, nums: List[int], target: int) -> int:
return bisect.bisect_left(nums, target)
Approach 2: Binary Search
Prerequisite
- C++
- Java
- Python
- JavaScript
class Solution {
public:
int searchInsert(vector<int>& nums, int target) {
// init the possible range
// as we insert at the end of the array,
// use nums.size() instead of nums.size() - 1
int l = 0, r = nums.size();
while (l < r) {
// take the lower mid for even elements
int m = l + (r - l) / 2;
// exclude m
if (target > nums[m]) l = m + 1;
// include m
else r = m;
}
return l;
}
};
class Solution {
public static int searchInsert(int[] nums, int target) {
return binarySearch(nums, 0, nums.length - 1, target);
}
public static int binarySearch(int arr[], int l, int r, int x) {
if (r >= l) {
int mid = l + (r - l) / 2;
if (arr[mid] == x) {
return mid;
}
if (arr[mid] > x)
return binarySearch(arr, l, mid - 1, x);
return binarySearch(arr, mid + 1, r, x);
}
return r + 1;
}
}
class Solution:
def searchInsert(self, nums: List[int], target: int) -> int:
left, right = 0, len(nums) - 1
while left <= right:
# find mid value
mid = (left + right) // 2
if nums[mid] == target:
return mid
# if mid value is less than target
elif nums[mid] < target:
# we are in right sorted portion
left = mid + 1
# if mid value is greater than target
else:
# we are in left sorted portion
right = mid - 1
return left
/**
* @param {number[]} nums
* @param {number} target
* @return {number}
*/
var searchInsert = function (nums, target) {
let left = 0;
let right = nums.length - 1;
while (left <= right) {
let mid = Math.floor((left + right) / 2);
if (target == nums[mid]) {
return mid;
} else if (target < nums[mid]) {
right = mid - 1;
} else {
left = mid + 1;
}
}
return left;
};