打卡记录
同积元组(哈希表 + 排列组合)
链接
思路:用哈希表将数组中出现的两不同数乘积依次记录,将出现两次以上的乘积组通过排列组合计算总情况个数。
class Solution {
public:
int tupleSameProduct(vector<int>& nums) {
int n = nums.size(), ans = 0;
unordered_map<int, int> hash;
for (int i = 0; i < n; ++i)
for (int j = i + 1; j < n; ++j)
hash[nums[i] * nums[j]]++;
for (auto& e : hash) {
if (e.second > 1) ans += e.second * (e.second - 1) / 2;
}
return ans * 8;
}
};
接雨水(单调栈)
链接
思路:横向计算填坑的面积,遍历数组时当前元素小于栈顶依次入栈,如果大于当前元素开始计算需要填补坑位的面积。(需记录底部高度)
class Solution {
public:
int trap(vector<int>& height) {
int ans = 0;
stack<int> stack;
for (int i = 0; i < height.size(); ++i) {
while (!stack.empty() && height[stack.top()] <= height[i]) {
int bottom = stack.top();
stack.pop();
if (stack.empty()) break;
int h = min(height[stack.top()], height[i]) - height[bottom];
ans += h * (i - stack.top() - 1);
}
stack.push(i);
}
return ans;
}
};