leetcode上面的第一道题就是两数之和,这道题虽然很简单但是也蕴含着不少算法知识。但后面又接二连三地出现了“三数之和”、“四数之和”,便有聪明的同学想:难道就没有什么通解吗?事实上是有的,这也是本文的目的。
解这类问题的原则有以下两条
1,排序
2,使用hashSet检验重复
第一条就不用说了,如果不排序的话很难保证找出全部的解,也不方便检验重复。
第二条的hashset包括两部分:各级(除最后两级以外)的访问过的值的集合,最后两级中访问过的值的集合,话不多说,三数和四数之和的代码如下:
三数之和
//三数之和
//判断 nums 中是否存在三个元素 a,b,c ,使得 a + b + c = 09 ?
//返回所有满足条件且不重复的三元组。
public static IList<IList<int>> ThreeSum(int[] nums)
{
return ThreeSum(nums, 0);
}
//解题思想
//使用“访问过的元素集合”来避免重复
public static IList<IList<int>> ThreeSum(int[] nums, int target)
{
//初始化
List<IList<int>> ans = new List<IList<int>>();