打卡第三十二天
3道简单题+1道中等题

题目两数之和:

思路:哈希表,对数组中的每一个数 x,寻找数组中是否存在 target - x。创建一个哈希表,对于每一个x,我们首先查询哈希表中是否存在 target - x,然后将 x 插入到哈希表中,保证不会让 x 和自己匹配。
代码:
class Solution {
public:vector<int> twoSum(vector<int>& nums, int target) {unordered_map<int,int> freq;//创建哈希表int n = nums.size(),sum = 0;for(int i = 0;i < n;i++){auto it = freq.find(target - nums[i]);//在哈希表中查找(target - nums[i])if(it != freq.end()){// 找到目标值//freq.end() 表示"未找到"的特殊位置,return {it -> second,i};// 返回目标值的索引和当前索引}freq[nums[i]] = i;//nums[i]:数组中的当前数字; i:当前数字在数组中的索引位置}return{};}
};

题目与对应负数同时存在的最大正整数:

思路:排序+双指针

代码:
class Solution {
public:int findMaxK(vector<int>& nums) {sort(nums.begin(),nums.end());// 对数组进行排序for(int i = 0,j = nums.size() - 1;i < j;j--){// 初始化双指针:i从最小数开始,j从最大数开始while(i < j && nums[i] < -nums[j]){// 移动左指针i,直到找到不小于当前负最大值的数i++;}if(nums[i] == -nums[j]){// 如果找到互为相反数的两个数return nums[j];// 返回正数(因为数组已排序,nums[j]是较大的正数)}}return -1;}
};
题目可互换矩形的组数:

思路:遍历+哈希表,把答案增加之前遍历过的宽高比的个数,在遍历的过程中,用一个哈希表统计每个元素的出现次数。
代码:
class Solution {
public:long long interchangeableRectangles(vector<vector<int>>& rectangles) {unordered_map<double,long long> freq;// 哈希表,键是宽高比,值是该比例出现的次数long long int n = rectangles.size(),ans = 0;for(int i = 0;i < n;i++){ans += freq[rectangles[i][0]/(double)rectangles[i][1]];// 计算当前矩形的宽高比,并累加之前相同比例的矩形数量freq[rectangles[i][0]/(double)rectangles[i][1]]++;// 更新当前宽高比的出现次数}return ans;// 返回可互换矩形的总对数}
};
题目要求 i<j,如果先更新freq,再更新答案,就把 nums[j] 自己也统计进来了,相当于把 i=j 的情况也认为是好数对,所以要先更新答案再更新freq
常用枚举技巧:枚举右,维护左
耗时≈1.5小时 明天继续