Given a sorted array 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 may assume no duplicates in the array.
假设数组中元素不重复
Example 1:
Input: [1,3,5,6], 5
Output: 2
Example 2:
Input: [1,3,5,6], 2
Output: 1
Example 3:
Input: [1,3,5,6], 7
Output: 4
Example 4:
Input: [1,3,5,6], 0
Output: 0
Solutions:
当看到排好序的数组的时候就应该想到二分法,因为二分法就是在排好序的数组上操作的
Python
(1)迭代法
class Solution:
def searchInsert(self, nums, target):
"""
:type nums: List[int]
:type target: int
:rtype: int
"""
for i in range(len(nums)): #遍历升序的数组,如果target小于数组中的数,直接返回这个数的index即可
if target <= nums[i]:
return i
return len(nums) #如果遍历之后都没有结果,说明target大于nums中的所有数,则返回len(nums)
(2)二分法
class Solution:
def searchInsert(self, nums, target):
"""
:type nums: List[int]
:type target: int
:rtype: int
"""
L = 0
R = len(nums)-1
while L <= R:
mid = (L+R)//2
if nums[mid] == target:
return mid #如果target在nums中,则直接返回所在的index
elif nums[mid]> target:
R = mid-1
else:
L = mid+1
return L #如果target不在nums中,返回L,target如果小于nums中所有数,L就是索引0,target如果大于nums中所有数,L为nums最后一个元素索引加一
C++
class Solution {
public:
int searchInsert(vector<int>& nums, int target) {
int L = 0;
int R = nums.size()-1;
while(L<=R){
int mid = (L+R)/2;
if (target == nums[mid]){
return mid;
}
else if(target > nums[mid]){
L = mid+1;
}
else{
R = mid-1;
}
}
return L;
}
};