目录
力扣350—两个数组的交集
题意
给你两个整数数组 nums1 和 nums2 ,请你以数组形式返回两数组的交集。返回结果中每个元素出现的次数,应与元素在两个数组中都出现的次数一致(如果出现次数不一致,则考虑取较小值)。可以不考虑输出结果的顺序。
关键字:数组、哈希表、双指针、二分查找
解法1—哈希表
class Solution
{
public:
vector<int> intersect(vector<int>& nums1, vector<int>& nums2)
{
unordered_map<int,int> umap; //存储 nums1 中各个数字出现的次数
vector<int> res; //返回结果
for(int i=0;i<nums1.size();++i) //遍历nums1,将各个数字出现的次数存入哈希表
{
umap[nums1[i]]++;
}
for(int j=0;j<nums2.size();++j) //遍历nums2,如果nums2中的数字在哈希表中可以找到,就将该数字存入结果res中
{
if(umap[nums2[j]])
{
res.emplace_back(nums2[j]);
umap[nums2[j]]--; //该数字出现次数要减一,因为如果元素出现次数不一致,我们要取较小值。
//这样如果该数字在nums1出现次数较小,返回的结果中该数字出现的次数就是nums1中出现的次数(因为该数字出现次数会不断减一,直到0)
//如果该数字在nums2出现的次数小,遍历nums2过程中,都会将该数字存入结果中,
// 最后,结果中该数字出现的次数都是两个数组中出现次数较小次数。
//这一步一开始没有想到,二刷要多注意呀。。。。。。。。。。。
}
}
return res;
}
};
解法2—排序后使用双指针
class Solution
{
public:
vector<int> intersect(vector<int>& nums1, vector<int>& nums2)
{
/*
一、哈希表
unordered_map<int,int> umap; //存储 nums1 中各个数字出现的次数
vector<int> res; //返回结果
for(int i=0;i<nums1.size();++i) //遍历nums1,将各个数字出现的次数存入哈希表
{
umap[nums1[i]]++;
}
for(int j=0;j<nums2.size();++j) //遍历nums2,如果nums2中的数字在哈希表中可以找到,就将该数字存入结果res中
{
if(umap[nums2[j]])
{
res.emplace_back(nums2[j]);
umap[nums2[j]]--; //该数字出现次数要减一,因为如果元素出现次数不一致,我们要取较小值。
//这样如果该数字在nums1出现次数较小,返回的结果中该数字出现的次数就是nums1中出现的次数
//如果该数字在nums2出现的次数小,遍历nums2过程中,都会将该数字存入结果中,
// 最后,结果中该数字出现的次数都是两个数组中出现次数较小次数。
//这一步一开始没有想到,二刷要多注意呀。。。。。。。。。。。
}
}
return res;
*/
//2、排序+双指针
sort(nums1.begin(),nums1.end());
sort(nums2.begin(),nums2.end());
int i=0,j=0;
vector<int> res;
//这里用 && 连接,因为只要有一方遍历完毕,那么两个数组的交集部分就遍历完了
while(i<nums1.size()&&j<nums2.size())
{
if(nums1[i]<nums2[j])
i++;
else if(nums1[i]>nums2[j])
j++;
else
{
res.emplace_back(nums1[i]); //这里,会让元素出现较小次数放入结果,
//因为遍历完了较小次数后,nums1[i]和nums2[j]就不相等了,i、j指针就会重新计数到二者相等的地方
i++;
j++;
}
}
return res;
}
};
力扣121—买卖股票的最佳时机
题意
给定一个数组 prices ,它的第 i 个元素 prices[i] 表示一支给定股票第 i 天的价格。
你只能选择 某一天 买入这只股票,并选择在 未来的某一个不同的日子 卖出该股票。设计一个算法来计算你所能获取的最大利润。
返回你可以从这笔交易中获取的最大利润。如果你不能获取任何利润,返回 0 。
关键字:数组、动态规划
解题思路—动态规划
class Solution
{
public:
int maxProfit(vector<int>& prices)
{
int res=0; //最终结果
int min=prices[0]; //设res为 [0,i-1]区域内的最小值
int i=1; //i为遍历prices的下标
while(i<prices.size())
{
//第i天的最大收益只需要知道前i天的最低点就可以算出来了。而第i天以前的最低点就是min
min = min<=prices[i-1]?min:prices[i-1]; //更新min
res = res>=(prices[i]-min)?res:prices[i]-min; //当前股票价格和它之前所有股票价格中最小之差是否大于res?
++i;
}
return res;
}
};