[leetcode][two pointers] 3Sum

本文探讨了在整数数组中寻找三个数相加等于零的所有唯一组合的问题。提供了两种解决方案,一种使用排序和双指针技巧实现,时间复杂度为O(n^2),空间复杂度为O(1);另一种采用哈希表方法,但可能会导致时间超限。

题目:

Given an array S of n integers, are there elements abc in S such that a + b + c = 0? Find all unique triplets in the array which gives the sum of zero.

Note:

  • Elements in a triplet (a,b,c) must be in non-descending order. (ie, a ≤ b ≤ c)
  • The solution set must not contain duplicate triplets.

    For example, given array S = {-1 0 1 2 -1 -4},

    A solution set is:
    (-1, 0, 1)
    (-1, -1, 2)
class Solution {
public:
//时间复杂度是O(nlogn)+O(n^2),所以总的时间复杂度是O(n^2),空间复杂度是O(1)
    vector<vector<int>> threeSum(vector<int>& nums) {
	vector<vector<int> > res;
	if (nums.size() < 3) return res;
	vector<int> oneTriplet(3);
	//排序
	sort(nums.begin(), nums.end());
	//for循环遍历数组,在其后用首尾指针找和为-nums[i]的两个元素,注意去重
	for (int i = 0; i < nums.size() - 2; ++i){
		if (i != 0 && nums[i] == nums[i - 1]) continue;//去重
		int target = -nums[i];
		int left = i + 1;
		int right = nums.size() - 1;
		while (left < right){
			if (left != i + 1 && nums[left] == nums[left - 1]){
				++left;
				continue;
			}
			if (right != nums.size() - 1 && nums[right] == nums[right + 1]){
				--right;
				continue;
			}
			if (nums[left] + nums[right] == target){
				
				oneTriplet[0] = nums[i];
				oneTriplet[1] = nums[left];
				oneTriplet[2] = nums[right];
				res.push_back(oneTriplet);
				++left;
			}
			else if (nums[left] + nums[right] < target) ++left;
			else --right;
		}
	}
	return res;
}
};


下面是用hash的方法找2sum,会TLE


class Solution {
public:
//时间复杂度是O(n*n*logn),空间复杂度是O(n)
vector<vector<int>> threeSum(vector<int>& nums) {
	vector<vector<int> > res;
	if (nums.size() < 3) return res;
	//排序
	sort(nums.begin(), nums.end());
	//for循环遍历数组,找2sum(hash),注意去重
	for (int i = 0; i < nums.size() - 2; ++i){
		if (i != 0 && nums[i] == nums[i - 1]) continue;//去重
		int target = -nums[i];
		set<pair<int, int> > lastTwo;
		if (found2Sum(nums, i + 1, target, lastTwo)){
			vector<int> tmp(3);
			for (set<pair<int, int> >::iterator iter = lastTwo.begin(); iter != lastTwo.end(); ++iter){
				tmp[0] = nums[i];
				tmp[1] = iter->first;
				tmp[2] = iter->second;
				res.push_back(tmp);
			}	
		}
	}
	return res;
}
private:
    bool found2Sum(vector<int> &nums, int start, int target, set<pair<int, int> > &lastTwo){//为了得到无重复的二元组,所以使用set
	if (start >= nums.size() - 1) return false;
	set<int> hashSet;
	hashSet.insert(nums[start]);
	for (int i = start + 1; i < nums.size(); ++i){
		if (hashSet.count(target - nums[i])){//找到
			lastTwo.insert(make_pair(target - nums[i], nums[i]));
		}
		hashSet.insert(nums[i]);
	}
	return lastTwo.size() ? true : false;
}
};


注:

1.本题和2sum不同,2sum要求输出下标,所以不能使用先对数组排序在使用首尾指针来查找,hash更合适。本题要求输出元素值,所以排序+首尾指针更合适(时间和空间效率都更高)

2.注意去重,而且两层都要去重。


内容概要:本文系统介绍了算术优化算法(AOA)的基本原理、核心思想及Python实现方法,并通过图像分割的实际案例展示了其应用价值。AOA是一种基于种群的元启发式算法,其核心思想来源于四则运算,利用乘除运算进行全局勘探,加减运算进行局部开发,通过数学优化器加速函数(MOA)和数学优化概率(MOP)动态控制搜索过程,在全局探索与局部开发之间实现平衡。文章详细解析了算法的初始化、勘探与开发阶段的更新策略,并提供了完整的Python代码实现,结合Rastrigin函数进行测试验证。进一步地,以Flask框架搭建前后端分离系统,将AOA应用于图像分割任务,展示了其在实际工程中的可行性与高效性。最后,通过收敛速度、寻优精度等指标评估算法性能,并提出自适应参数调整、模型优化和并行计算等改进策略。; 适合人群:具备一定Python编程基础和优化算法基础知识的高校学生、科研人员及工程技术人员,尤其适合从事人工智能、图像处理、智能优化等领域的从业者;; 使用场景及目标:①理解元启发式算法的设计思想与实现机制;②掌握AOA在函数优化、图像分割等实际问题中的建模与求解方法;③学习如何将优化算法集成到Web系统中实现工程化应用;④为算法性能评估与改进提供实践参考; 阅读建议:建议读者结合代码逐行调试,深入理解算法流程中MOA与MOP的作用机制,尝试在不同测试函数上运行算法以观察性能差异,并可进一步扩展图像分割模块,引入更复杂的预处理或后处理技术以提升分割效果。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值