华为机试od社招刷题攻略-三数之和

三数之和

题目

输入一个不重复的正整数数组,查找三个数和为target的组合。输出三个数从小到大排序。

输入描述
第一行:不重复的正整数数组nums 。nums.length>=3
第二行:目标值target
输出描述
三个一行,和为target。三个数依次从小到大排序.

输入
10 5 1 9 6
16
输出
1 5 10
1 6 9


输入
3 2 1
6
输出
1 2 3

思路

  1. 需要查找三个数,最简单的就是三层循环遍历,查找所有的组合方式并判断。
  2. 技巧提示: 当看到题目中需要排序时,可以事先排序简化遍历方式。

Java

	void threeSum(int[] arr, int target) {
		int len = arr.length;

		Arrays.sort(arr);
		for (int i = 0; i < len - 2; i++) {
			for (int j = i + 1; j < len - 1; j++) {
				for (int k = j + 1; k < len; k++) {
					if (arr[i] + arr[j] + arr[k] == target) {
						System.out.printf("%d %d %d\n", arr[i], arr[j], arr[k]);
					}
				}
			}
		}
	}

排序之后,在前两个数确定时,需要查找的第三个数也就确定了。此时不需要再逐一遍历查询,可以进行二分查找。

Java优化

	void threeSumWithBinarySearch(int[] arr, int target) {
		int len = arr.length;
		Arrays.sort(arr);
		for (int i = 0; i < len - 2; i++) {
			for (int j = i + 1; j < len - 1; j++) {
				//相当于在[j+1,arr.length-1]中查找num
				int num = target - arr[i] - arr[j];
				int res = BinarySearch.binarySearchWithRecursive(arr, j + 1, arr.length - 1, num);
				if (res != -1) {
					System.out.printf("%d %d %d\n", arr[i], arr[j], arr[res]);
				}

			}
		}
	}

你可能感兴趣的:(数据结构和算法,算法)