每日一题(三数之和)+深度学习论文阅读
第15题. 三数之和
给你一个包含 n 个整数的数组 nums,判断 nums 中是否存在三个元素 a,b,c ,使得 a + b + c = 0 ?请你找出所有满足条件且不重复的三元组。
注意: 答案中不可以包含重复的三元组。
示例:
给定数组 nums = [-1, 0, 1, 2, -1, -4],
满足要求的三元组集合为: [ [-1, 0, 1], [-1, -1, 2] ]
采取排序去重方法,耗时和内存占用都很极限,这题确实有点意思,“去重”是关键难点,明天试试用更简单的方法解决
class Solution4 { //太菜了,抄个去重解法
public:
vector<vector<int>> threeSum(vector<int>& nums) {
vector<vector<int>> result;
sort(nums.begin(), nums.end());
// 找出a + b + c = 0
// a = nums[i], b = nums[j], c = -(a + b)
for (int i = 0; i < nums.size(); i++) {
// 排序之后如果第一个元素已经大于零,那么不可能凑成三元组
if (nums[i] > 0) {
break;
}
//循环是两层组合式的,去重也要注意
if (i > 0 && nums[i] == nums[i - 1]) { //去重:i>0才开始判断,而下边的循环会往后看2个,因此最多重复的3个元素已经全看了遍
continue;
}
unordered_set<int> set;
for (int j = i + 1; j < nums.size(); j++) {
if (j > i + 2&& nums[j] == nums[j-1]&& nums[j-1] == nums[j-2]) { // 三元组元素b去重,最多需要往后看2个元素,然后才去重
continue;
}
int c = 0 - (nums[i] + nums[j]);
if (set.find(c) != set.end()) {
result.push_back({nums[i], nums[j], c});
set.erase(c);// 一种三元组和只要删除一个元素,就相当于删除了该种组合;由于这里序列是顺序排列的,因此c一定是比num[i、j]更小的,之后往下走必然不会有找到带c的组合
} else {
set.insert(nums[j]);
}
}
}
return result;
}
};
论文阅读
读了篇学长的毕设,了解了图片多模态与联合学习,学长分离了ROI区域,将ROI和原图分别塞进两个cnn模型里,再用自适应阈值融合调参,就能得到更好的结果
感觉毕设挺水的,排列组合了下模型理论,希望这种水平能发期刊?