三数之和: 给一个整型数组nums, 一个目标值target, 从数组中找出所有三个数之和等于target的整数, 并返回这三个整数的下标。

一)介绍

题意:从指定的整型nums数组中,随机取三个数,这三个数之和需要等于指定的target,如下图。

分析:第一种场景是nums数组中没有负数的情况,这种情况求和的计算会少一点,因为只要比target大的数都不需要计算。

          第二种场景是nums数组中有负数的情况,这种情况求和,就需要考虑nums中所有的数了,本章是考虑了该情况。

问题解决思路:先从nums数组中,取一个固定的数,可以取最左边或最右边的值,然后剩下的两个值就按照两数之和中双指针的方式获取,最后三个数相加等于target。

备注:该篇章就只列举了双指针法。穷举法就是三个for嵌套,然后求和,就不列举了。

二)功能实现

双指针:一个指针从前往后扫描,一个指针从后往前扫描

               只是在两数之和双指针方式上调整了一小部分代码。

/**
 * 双指针法
 * @param nums
 * @param target
 */
public static void finger(int[] nums, int target) {
	if (nums == null) {
		return;
	}
		
	// 记录数组的长度
	int lengths = nums.length-1;
		
	// 先固定一个值,要么固定最左边的值,要么固定最右边的值
	for (int i = 0; i < lengths; i++) {
			
		int left = (i + 1); // 左指针
		int right = lengths; // 右指针
			
		int low = (i + 1); // 临时左指针
		int high = lengths; // 临时右指针
			
		// 当左指针小于右指针的时候,就不需要循环了
		while (left < right) {
				
			// 比较临时指针
			while (low < high) {
				if ((nums[i] + nums[low] + nums[high]) == target) {
					System.out.println("三个数之和等于" + target + "的分别是: " + nums[i] +"、" + nums[low] + "和" + nums[high]);
				}
				high--; // 相当于从右往左一直找数
			}
				
			high = right--; // 循环找完一遍数之后,把临时右指针还原,右指针减1
			low = ++left; // 因为临时左指针第一个元素已经比较完,所有临时左指针加1,左指针也加1
				
			while (low < high) {
				if ((nums[i] + nums[low] + nums[high]) == target) {
					System.out.println("三个数之和等于" + target + "的分别是: " + nums[i] +"、" + nums[low] + "和" + nums[high]);
				}
				low++; // 相当于从左往右一直找数
			}
				
			low = left; // 循环找完一遍数之后,把临时左指针还原,下次循环使用
				high--; // 临时右指针也减1,下次循环使用
		}
	}
}

识别二维码关注个人微信公众号

本章完结,待续,欢迎转载!
 
本文说明:该文章属于原创,如需转载,请标明文章转载来源!


版权声明:本文为p812438109原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接和本声明。