文章目录
题目:【leetcode】35. 搜索插入位置
给定一个排序数组和一个目标值,在数组中找到目标值,并返回其索引。如果目标值不存在于数组中,返回它将会被按顺序插入的位置。
请必须使用时间复杂度为 O(log n) 的算法。
注意:nums 为 无重复元素 的 升序 排列数组。
示例 1:
输入: nums = [1,3,5,6], target = 5
输出: 2
示例 2:
输入: nums = [1,3,5,6], target = 2
输出: 1
示例 3:
输入: nums = [1,3,5,6], target = 7
输出: 4
Try 1:
1.代码
#include<algorithm>
class Solution {
public:
int searchInsert(vector<int>& nums, int target) {
if(find(nums.begin(),nums.end(),target) != nums.end()){
//元素在数组内
return find(nums.begin(),nums.end(),target);//返回索引值
}else{
nums.push_back(target);//将target加入nums
nums.sort(nums.begin(),nums.end());//对nums升序排序
return find(nums.begin(),nums.end(),target);//返回索引值
}
}
};
2.报错
3.解决
函数返回类型是int,但是 return 尝试返回一个迭代器类型。需要修改返回值类型
。主要是因为对 find()函数理解不透彻,下面利用distance()函数返回索引值。
Try 2:
1.代码
#include<algorithm>
#include<vector>
using namespace std;
class Solution {
public:
int searchInsert(vector<int>& nums, int target) {
if(find(nums.begin(),nums.end(),target)!= nums.end()){
//元素在数组内
return distance(nums.begin(),find(nums.begin(),nums.end(),target));//返回索引值
}else{
nums.push_back(target);//将target加入nums
nums.sort(nums.begin(),nums.end());//对nums升序排序
return distance(nums.begin(),find(nums.begin(),nums.end(),target));//返回索引值
}
}
};
2.报错
3.解决
sort函数的使用方式不正确,应该是sort(nums.begin(), nums.end())
,而不是nums.sort(nums.begin(), nums.end())
。主要是对 sort()函数 理解不透彻。
Try 3:
1.代码
#include<algorithm>
#include<vector>
using namespace std;
class Solution {
public:
int searchInsert(vector<int>& nums, int target) {
if(find(nums.begin(),nums.end(),target)!= nums.end()){
//元素在数组内
return distance(nums.begin(),find(nums.begin(),nums.end(),target));//返回索引值
}else{
nums.push_back(target);//将target加入nums
sort(nums.begin(),nums.end());//对nums升序排序
return distance(nums.begin(),find(nums.begin(),nums.end(),target));//返回索引值
}
}
};
2.结果
运行成功。
相关函数
1. find()函数
find() 函数本质上是一个模板函数,用于在指定范围内查找和目标元素值相等的第一个元素。
如下为 find() 函数的语法格式:
InputIterator find (InputIterator first, InputIterator last, const T& val);
其中,first 和 last 为输入迭代器,[first, last)
用于指定该函数的查找范围;val 为要查找的目标元素。
另外,该函数会返回一个输入迭代器
,当 find() 函数 查找成功 时,其指向的是在 [first, last) 区域
内查找到的第一个目标元素
;如果 查找失败,则该迭代器的指向和 last 相同
。
示例:
find(nums.begin(),nums.end(),target) != nums.end()
//这一句用于判断元素target是否在nums内。如果在,那么返回的是查找到的第一个目标元素;如果不在,
2. distance()函数
作用于同一容器的 2 个同类型迭代器可以有效指定一个区间范围。在此基础上,如果想获取该指定范围内包含元素的个数,就可以借助distance() 函数
。
distance() 函数用于计算两个迭代器表示的范围内包含元素的个数,其语法格式如下:
template <class InputIterator>
typename iterator_traits<InputIterator>::difference_type distance (InputIterator first, InputIterator last);
其中,first 和 last 都为迭代器,其类型可以是输入迭代器、前向迭代器、双向迭代器以及随机访问迭代器;该函数会返回[first, last)
范围内包含的元素的个数
。
示例:
return distance(nums.begin(),find(nums.begin(),nums.end(),target));
//返回nums第一个元素到find找到的target元素内包含的元素的个数,即为索引值。
3. sort()函数
sort()是排序函数,通过调用它,我们可以很轻松地实现对普通数组或者容器中指定范围内的元素进行排序。
以下为sort()的语法格式:
//对 [first, last) 区域内的元素做默认的升序排序
void sort (RandomAccessIterator first, RandomAccessIterator last);
sort() 函数位于头文件中,因此在使用该函数前,程序中应包含如下语句:#include <algorithm>
需要注意的是,使用方法是
sort(nums.begin(),nums.end());//对nums升序排序
而不是
nums.sort(nums.begin(),nums.end());//对nums升序排序
4. push_back()函数
向 vector 容器中添加元素的唯一方式就是使用它的成员函数,如果不调用成员函数,非成员函数既不能添加也不能删除元素。
在这些成员函数中,可以用来给容器中添加元素的函数有 2 个,分别是 push_back()
和 emplace_back() 函数。下面主要介绍push_back()
函数。
push_back()的功能是在 vector 容器尾部添加一个元素。
以下为push_back的语法格式:
vector<int> values{};
values.push_back(1);//将1添加到values的尾部。
示例:
nums.push_back(target);//将target加入nums尾部,然后利用sort进行排序。
参考文章:
1、C++ find()函数用法详解(超级详细)
2、C++ sort()排序函数用法详解
3、C++ STL distance()函数用法详解(一看就懂)
4、C++ STL vector添加元素(push_back()和emplace_back())详解