【打卡】【LeetCode学习计划】《数据结构入门-C++》第3天 数组

原文链接;【LeetCode学习计划】《数据结构入门-C++》第3天 数组_Wang_Xin_Ling的博客-CSDN博客

目录

350. 两个数组的交集 IILeetCode: 350. 两个数组的交集 II

方法1:哈希表

法2:排序 + 双指针

21. 买卖股票的最佳时机LeetCode: 121. 买卖股票的最佳时机

 方法1:动态规划 + 滑动数组


350. 两个数组的交集 II
LeetCode: 350. 两个数组的交集 II

题目:

给你两个整数数组 nums1 和 nums2 ,请你以数组形式返回两数组的交集。返回结果中每个元素出现的次数,应与元素在两个数组中都出现的次数一致(如果出现次数不一致,则考虑取较小值)。可以不考虑输出结果的顺序。

 

方法1:哈希表

大佬思路:
我们可以先遍历较短的数组并把其内的所有元素存入哈希表中。由于数组内存在重复的元素,为了使多个重复元素按照在2个数组中出现的次数匹配,而不至于全部匹配,所以哈希表记录的是短数组中每个字符的计数。然后遍历一次长数组。如果长数组的某个元素已经存在于哈希表了,就把它添加到答案数组。因为成功匹配到了,所以还要将哈希表中对应字符的计数减1。

设A AA为短数组中元素的集合(包含重复元素),则哈希表在最初的状态即为A AA。到了最后,由于短数组A AA和长数组B BB的交集已经摘掉了,因此最后哈希表的状态为A − ( A ∩ B ) 

之所以使用较短的数组存入哈希表是为了尽可能的减少实际的空间消耗。
 

1)const int num : (bigger ? nums2 : nums1) 三元表达式

表达式一?表达式二:表达式三     式一为真的话返回式二      式一为假的话返回式三

eg: age>18 ? (a='成年人',b='18岁以上') : (a='未成年人',b='18岁以下');

2.

这一行代码意思是找到元素在哈希表中(证明就是交集元素) 

intersection   emplace_back函数往容器中增加新元素(对临时对象的赋值)

3.

 

 当哈希表中的值等于0 就是用完了该元素

哈希表删除该值   erase()删除字符串中的字符

#include <vector>
#include <unordered_map>
using namespace std;
class Solution
{
public:
    vector<int> intersect(vector<int> &num1,vector<int> &num2)
    {
        bool bigger = num1.size() > num2.size();
        unordered_map<int, int> hashtable;
        for (const int num : (bigger ? num2 : num1))
        {
            hashtable[num]++;
        }

        vector<int> intersection;
        for (const int num : (bigger ? num1 : num2))
        {
            if (hashtable.find(num) != hashtable.end())
            {
                intersection.emplace_back(num);
                hashtable[num]--;
                if (hashtable[num]== 0)
                {
                    hashtable.erase(num);
                }
            }
        }
        return intersection;

    }
};

 

 

法2:排序 + 双指针


如果把两个数组都排序好后,使用双指针查找的思路比较容易。

在两个数组的起始项各设置一个指针。

1.每当两个指针指向的值相等,则存入答案数组,且两个指针同时向后走一步。
2.若一个指针指向的值小于另一个指针指向的值,那么这个指针必然要往后走,因为往后走必然是更大的值,才有可能和另一个指针对应上。
 

it1 为索引(指针)                                                                  *it1指针的值 

#include <vector>
#include <algorithm>
using namespace std;
class Solution
{
public:
    vector<int> intersect(vector<int> &nums1, vector<int> &nums2)
    {
        sort(nums1.begin(), nums1.end());
        sort(nums2.begin(), nums2.end());

        const int len1 = nums1.size(), len2 = nums2.size();
        vector<int> intersection;
        auto it1 = nums1.begin(), it2 = nums2.begin();
        while (it1 != nums1.end() && it2 != nums2.end())
        {
            if (*it1 == *it2)
            {
                intersection.emplace_back(*it1);
                it1++;
                it2++;
            }
            else if (*it1 < *it2)
            {
                it1++;
            }
            else
            {
                it2++;
            }
        }
        return intersection;
    }
};

21. 买卖股票的最佳时机
LeetCode: 121. 买卖股票的最佳时机

题目:

给定一个数组 prices ,它的第 i 个元素 prices[i] 表示一支给定股票第 i 天的价格。
你只能选择 某一天 买入这只股票,并选择在 未来的某一个不同的日子 卖出该股票。设计一个算法来计算你所能获取的最大利润。
返回你可以从这笔交易中获取的最大利润。如果你不能获取任何利润,返回 0 。

 

 方法1:动态规划 + 滑动数组

 

 标准库头文件<climits>里的INT_MAX整型最大值

那初值必然得是个最大值 不然后面都比前面小,就不好运行了

#include <vector>
using namespace std;
class Solution
{
public:
    int maxProfit(vector<int> &prices)
    {
        int minprice = INT_MAX,ans = 0;
        for (const int price :prices)
        {
            minprice = min(price,minprice);
            ans = max(ans,price-minprice);
        }
        return ans;
    }
};

 

Guess you like

Origin blog.csdn.net/qq_62932195/article/details/121865281