力扣 数据结构基础(2)

95 阅读2分钟

本文已参与「新人创作礼」活动,一起开启掘金创作之路。

5.两个数组的交集

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

我看官方答案是利用哈希表来解,但比较麻烦,找了个简单的方法

class Solution {
public:
    vector<int> intersect(vector<int>& nums1, vector<int>& nums2) {
        if(nums1.size() > nums2.size()) return intersect(nums2, nums1);
        map<int, int> m;
        vector<int> res;
        for(auto i : nums1) ++m[i];
        for(auto i : nums2) if(m[i]) --m[i], res.push_back(i);
        return res;
    } 
};

6.买股票的最佳时机

给定一个数组 prices ,它的第 i 个元素 prices[i] 表示一支给定股票第 i 天的价格。

 

你只能选择 某一天 买入这只股票,并选择在 未来的某一个不同的日子 卖出该股票。设计一个算法来计算你所能获取的最大利润。

 

返回你可以从这笔交易中获取的最大利润。如果你不能获取任何利润,返回 0 。

 

我们需要找出给定数组中两个数字之间的最大差值(即,最大利润)。此外,第二个数字(卖出价格)必须大于第一个数字(买入价格)。

 

形式上,对于每组 iii 和 jjj(其中 j>ij > ij>i)我们需要找出 max⁡(prices[j]−prices[i])\max(prices[j] - prices[i])max(prices[j]−prices[i])。

暴力解题

class Solution {
public:
    int maxProfit(vector<int>& prices) {
        int n = (int)prices.size(), ans = 0;
        for (int i = 0; i < n; ++i){
            for (int j = i + 1; j < n; ++j) {
                ans = max(ans, prices[j] - prices[i]);
            }
        }
        return ans;
    }
};

但这样会显示超时,所以我修改了一下二成循环

class Solution {
public:
    int maxProfit(vector<int>& prices) {
        int n = (int)prices.size(), ans = 0;
        for (int i = 0; i < n; ++i){
            for (int j = i + 1; j < n&& prices[j] > prices[i]; ++j) {
                ans = max(ans, prices[j] - prices[i]);
            }
        }
        return ans;
    }
};

j < n&& prices[j] > prices[i]:避免了j<i时的运算

7.重塑矩阵

在 MATLAB 中,有一个非常有用的函数 reshape ,它可以将一个 m x n 矩阵重塑为另一个大小不同(r x c)的新矩阵,但保留其原始数据。

 

给你一个由二维数组 mat 表示的 m x n 矩阵,以及两个正整数 r 和 c ,分别表示想要的重构的矩阵的行数和列数。

 

重构后的矩阵需要将原始矩阵的所有元素以相同的 行遍历顺序 填充。

 

如果具有给定参数的 reshape 操作是可行且合理的,则输出新的重塑矩阵;否则,输出原始矩阵。

 

 

属实不好整,根据提示,我们的思路是二维数组的一维表示,表示的话还是比较简单的

对于n行n列:

(i,j)=n*i+j

然后我们再将一维数组n求商为i求余为j

之后便可以进行判断

class Solution {
public:
    vector<vector<int>> matrixReshape(vector<vector<int>>& nums, int r, int c) {
        int m = nums.size();
        int n = nums[0].size();
        if (m * n != r * c) {
            return nums;
        }


        vector<vector<int>> ans(r, vector<int>(c));
        for (int x = 0; x < m * n; ++x) {
            ans[x / c][x % c] = nums[x / n][x % n];
        }
        return ans;
    }
};