20. 三数和为0
有一个长度为n的整型数组arr,从中选出3个数a,b,c,使得a+b+c=0,找出所有满足条件的三元组(a,b,c)。重复的三元组只算一次。
样例:数组[2, 1, -3, -3, 0, -1],满足条件的三元组有2个:(2, 1, -3)和(1, 0, -1)。
提示:本题存在空间复杂度O(1)的算法(不使用任何辅助空间),没必要利用set
等数据结构消除重复的三元组。
不知道咋实现LIST的三元数组啊……找了找,没找到。只能用蠢办法了。
using System; using System.Collections.Generic; using System.Linq; using System.Text; namespace ConsoleApplication16 { class Program { static void Main(string[] args) { int[] input = { 2, 1, -3, -3, 0, -1 }; int[,] result = FindThreeNumSumZero2(input); for (int i = 0; i < result.GetLength(0); i++) { for (int j = 0; j < result.GetLength(1); j++) { Console.Write(result[i, j] + ","); } Console.WriteLine(); } } static int[,] FindThreeNumSumZero(int[] input) { if (input.Length < 2 || input == null) { throw new Exception("input must be greater than 2."); } int[,] result = new int[input.Length, 3]; int x = 0; for (int i = 0; i < input.Length; i++) { for (int j = i + 1; j < input.Length; j++) { for (int k = j + 1; k < input.Length; k++) { if (input[i] + input[j] + input[k] == 0) { result[x, 0] = input[i]; result[x, 1] = input[j]; result[x, 2] = input[k]; x++; } } } } return result; } static int[,] FindThreeNumSumZero2(int[] input) { if (input.Length < 2 || input == null) { throw new Exception("input length must be greater than 2"); } Array.Sort(input); int[,] results = new int[input.Length, 3]; int n = input.Length; int c = 0; for (int i = 0; i < n - 2; i++) { int j = i + 1; int k = n - 1; while (j < k) { int x = input[i] + input[j] + input[k]; if (x > 0) { k--; } if (x < 0) { j++; } if (x == 0) { results[c, 0] = input[i]; results[c, 1] = input[j]; results[c, 2] = input[k]; c++; k--; j++; } } } return results; } } }