解题报告
增量元素之间的最大差值
题目链接:2016. 增量元素之间的最大差值
题目描述
给你一个下标从 0 开始的整数数组 nums ,该数组的大小为 n ,请你计算 nums[j] - nums[i] 能求得的 最大差值 ,其中 0 <= i < j < n 且 nums[i] < nums[j] 。
返回 最大差值 。如果不存在满足要求的 i 和 j ,返回 -1 。
解题思路
比较容易想到的方法是二重循环,枚举每个数的差值即可,时间复杂度是O(n^2)。
我们可以遍历的同时维护一个当前最小数preMin
,对于preMin
来说,若nums[i] > preMin
,则最大差值为nums[i] - preMin
;否则,更新当前维护的最小数preMin = nums[i]
。时间复杂度为O(n)。
class Solution {
public:
int maximumDifference(vector<int>& nums) {
int n = nums.size();
int maxSub = -1, preMin = nums[0];
for(int i = 1; i < n; i ++ ){
if(nums[i] > preMin)
maxSub = max(maxSub, nums[i] - preMin);
else
preMin = nums[i];
}
return maxSub;
}
};
找到最接近 0 的数字
题目链接:2239. 找到最接近 0 的数字
题目描述
给你一个长度为 n 的整数数组 nums ,请你返回 nums 中最 接近 0 的数字。如果有多个答案,请你返回它们中的 最大值 。
解题思路
遍历数组,遇到绝对值更接近 0 的数,更新答案;遇到有相同接近距离的数,取最大值。
class Solution {
public:
int findClosestNumber(vector<int>& nums) {
int n = nums.size();
int ans = 100001;
for(int i = 0; i < n; i ++ ){
if(abs(nums[i]) < abs(ans))
ans = nums[i];
else if(abs(nums[i]) == abs(ans))
ans = max(ans, nums[i]);
}
return ans;
}
};
商品折扣后的最终价格
题目链接:1475. 商品折扣后的最终价格
题目描述
给你一个数组 prices ,其中 prices[i] 是商店里第 i 件商品的价格。
商店里正在进行促销活动,如果你要买第 i 件商品,那么你可以得到与 prices[j] 相>等的折扣,其中 j 是满足 j > i 且 prices[j] <= prices[i] 的 最小下标 ,如果没有满足>条件的 j ,你将没有任何折扣。
请你返回一个数组,数组中第 i 个元素是折扣后你购买商品 i 最终需要支付的价格。
解题思路
初始化一个数组用来存储答案,遍历开始时存入原价格,遍历之后的数,满足条件则更新当前的价格并跳出循环,否则保留原价格。
class Solution {
public:
vector<int> finalPrices(vector<int>& prices) {
int n = prices.size();
vector<int> ans(n, 0);
for(int i = 0; i < n; i ++ ){
ans[i] = prices[i];
for(int j = i + 1; j < n; j ++ ){
if(prices[j] <= prices[i]){
ans[i] = prices[i] - prices[j];
break;
}
}
}
return ans;
}
};
多个数组求交集
题目链接:2248. 多个数组求交集
题目描述
给你一个二维整数数组 nums ,其中 nums[i] 是由 不同 正整数组成的一个非空数组,按 升序排列 返回一个数组,数组中的每个元素在 nums 所有数组中都出现过。
解题思路
用一个hash数组统计每一个数出现的次数,最后遍历hash数组,返回所有出现次数等于nums.size()的元素。
class Solution {
public:
vector<int> intersection(vector<vector<int>>& nums) {
int n = nums.size(), m;
vector<int> ans;
vector<int> hash(1001, 0);
for(int i = 0; i < n; i ++ ){
m = nums[i].size();
for(int j = 0; j < m; j ++ ){
hash[nums[i][j]] ++ ;
}
}
for(int i = 0; i < 1001; i ++ ){
if(hash[i] == n)
ans.push_back(i);
}
return ans;
}
};