35. 搜索插入位置【数组】
描述:给定一个排序数组和一个目标值,在数组中找到目标值,并返回其索引。如果目标值不存在于数组中,返回它将会被按顺序插入的位置。
你可以假设数组中无重复元素。
示例 1:
输入: [1,3,5,6], 5
输出: 2
示例 2:
输入: [1,3,5,6], 2
输出: 1
示例 3:
输入: [1,3,5,6], 7
输出: 4
示例 4:
输入: [1,3,5,6], 0
输出: 0
暴力法挨个遍历
class Solution {
public:
int searchInsert(vector<int>& nums, int target) {
int count=nums.size();
if(count==0)//空的
{
nums.push_back(target);
return 0;
}
if(nums[count-1]<target)//都比目标值
{
nums.push_back(target);
return count;
}
for(int i=0;i<count;i++){//目标值在中间
if(nums[i]==target)
{ return i;}
else if(nums[i]>target)
{
nums.insert(nums.begin()+i,target);
return i;
break;
}
}
return 0;
}
};
二分法
对于有顺序的数组,经常会采用二分法
思路:先把目标值在最左面和最右面,再用二分法。
设定左右区间,落在左区间,right右移;落在右区间,left左移。
while确定退出条件left==right,if确定落在的区间。
class Solution {
public:
int searchInsert(vector<int>& nums, int target) {
int count=nums.size();
if(count==0)//空的
{
//nums.push_back(target);
return 0;
}
if(nums[count-1]<target)//都比目标值
{
//nums.push_back(target);
return count;
}
int left = 0;
int right = count- 1;
while(right>left)
{
int mid=(left+right)/2;
if(nums[mid]<target)
left=mid+1;
else
right=mid;
}
return left;
}
};