本文已参与「新人创作礼」活动,一起开启掘金创作之路。
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;
}
};