#include <iostream>
#include<vector>
#include<numeric>
#include<algorithm>
using namespace std;
/*
给定一个排序数组和一个目标值,在数组中找到目标值,并返回其索引。如果目标值不存在于数组中,返回它将会被按顺序插入的位置。
*/
//思路1 利用find函数
class Solution
{
public:
int searchInsert(vector<int>& nums, int target)
{
//利用find函数在容器中寻找目标值
//find函数返回一个迭代器
//在目标范围内查询成功返回指向目标值的迭代器,否则返回指向末尾元素的迭代器end()
auto it = find(nums.begin(), nums.end(), target);
if (it != nums.end())
return (it-nums.begin());//返回目标值下标索引
else
{
nums.push_back(target); //在末尾插入目标值
sort(nums.begin(), nums.end()); //对新产生的容器进行默认从小到大的排序
auto itt = find(nums.begin(), nums.end(), target);
return (itt - nums.begin());//返回此时目标值在容器中的下标索引
}
}
};
//思路2 逐个遍历
class Solution
{
public:
int searchInsert(vector<int>& nums, int target)
{
for (auto i:nums)
{
if (target <= i)
return i;
}
return nums.size();
}
};
//思路3 二分法
//提到排序,考虑是否能使用二分法
class Solution
{
public:
int searchInsert(vector<int>& nums, int target)
{
int mid,left=0,right=nums.size()-1;
while (left <= right)//防止数据溢出
{
mid = (left + right) / 2;
if (target < nums[mid])//目标值在左半边
right = mid - 1;
else if (target > nums[mid])//目标值在右半边
left = mid + 1;
else if (target == nums[mid])
return mid;//如果找到就返回
}
//未找到返回应该插入的位置
return left;
}
};
int main()
{
vector<int> v;
int b[4],c;
for (auto i : b)
{
cin >> i;
v.push_back(i);
}
cin >> c;
Solution a;
auto d= a.searchInsert(v,c);
cout << d;
return 0;
}
LC 搜索插入位置(3种思路)
于 2024-01-22 21:10:06 首次发布