题1:两数之和。unordered_map底层数据结构采用哈希表。这里插入的键值分别为nums的值和下标。容易出现问题的点是,插入的键值可能会是重复的。而unordered_map不接受重复键值,会跳过。哈希表的查找时间为O(1)。
class Solution {
public:
vector<int> twoSum(vector<int>& nums, int target) {
unordered_map<int,int>m(nums.size());
//unordered_map哈希表,不存储重复key
for(int i=0;i<nums.size();i++)
{
m.insert(pair<int,int>(nums[i],i));
}
for(int j=0;j<=nums.size();j++)
{
auto it=m.find(target-nums[j]);
if(it!=m.end()&&it->second!=j)
{
return{j,it->second};
}
}
return {};
}
};
问题1929
vector的resize和reserve的区别?前者改变capacity和size,后者仅改变capacity。
class Solution {
public:
vector<int> getConcatenation(vector<int>& nums) {
int n=nums.size();
for(int i=0;i<n;i++)
nums.push_back(nums[i]);
return nums;
}
};
问题771
总结:lambda表达式和for_each
[捕获参数列表](传入参数)mutable exception->返回值类型{函数体}
捕获参数列表一般指在lambda之前已经出现的变量,并在后续函数体中用到的参数,分为值传递和引用传递。mutable修饰符表示可以修改值传递的捕获参数的拷贝(仅改变lambda函数体中的值,但不影响lambda之外的值),exception用来指定抛出的异常。
for_each(first,last,func)在[first,last)范围内将每个元素传入函数func并执行。
class Solution {
public:
int numJewelsInStones(string jewels, string stones) {
int num=0;
for(auto i:jewels)
for_each(begin(stones),end(stones),[&num,i](int x){(x==i)?num++:0;});
return num;
}
};