如何在数组中找到和为“特定值”的三个数?( 二 )


如何在数组中找到和为“特定值”的三个数?文章插图
如何在数组中找到和为“特定值”的三个数?文章插图
这样说起来有些抽象 , 我们来具体演示一下:
第1轮 , 访问数组的第1个元素1 , 把问题转化成从后面元素中找出和为12(13-1)的两个数 。
如何找出和为12的两个数呢?我们设置两个指针 , 指针j指向剩余元素中最左侧的元素2 , 指针k指向最右侧的元素12:
如何在数组中找到和为“特定值”的三个数?文章插图
计算两指针对应元素之和 , 2+12 = 14 > 12 , 结果偏大了 。
由于数组是按照升序排列 , k左侧的元素一定小于k , 因此我们把指针k左移一位:
如何在数组中找到和为“特定值”的三个数?文章插图
计算两指针对应元素之和 , 2+9 = 11< 12 , 这次结果又偏小了 。
j右侧的元素一定大于j , 因此我们把指针j右移一位:
如何在数组中找到和为“特定值”的三个数?文章插图
计算两指针对应元素之和 , 3+9 = 12 , 正好符合要求!
因此我们成功找到了一组匹配的组合:1 , 3 , 9
但这并不是结束 , 我们要继续寻找其他组合 , 让指针k继续左移:
如何在数组中找到和为“特定值”的三个数?文章插图
计算两指针对应元素之和 , 3+7 = 10< 12 , 结果偏小了 。
于是我们让指针j右移:
如何在数组中找到和为“特定值”的三个数?文章插图
计算两指针对应元素之和 , 5+7 = 12 , 又找到符合要求的一组:
1 , 5 , 7
我们继续寻找 , 让指针k左移:
如何在数组中找到和为“特定值”的三个数?文章插图
计算两指针对应元素之和 , 5+6 = 11< 12 , 结果偏小了 。
于是我们让指针j右移:
如何在数组中找到和为“特定值”的三个数?文章插图
此时双指针重合在了一起 , 如果再继续移动 , 就有可能和之前找到的组合重复 , 因此我们直接结束本轮循环 。
第2轮 , 访问数组的第2个元素2 , 把问题转化成从后面元素中找出和为11(13-2)的两个数 。
我们仍然设置两个指针 , 指针j指向剩余元素中最左侧的元素3 , 指针k指向最右侧的元素12:
如何在数组中找到和为“特定值”的三个数?文章插图
计算两指针对应元素之和 , 3+12 = 15 > 11 , 结果偏大了 。
我们让指针k左移:
如何在数组中找到和为“特定值”的三个数?文章插图
计算两指针对应元素之和 , 3+9 = 12 > 11 , 结果仍然偏大 。
我们让指针k继续左移:
如何在数组中找到和为“特定值”的三个数?文章插图
计算两指针对应元素之和 , 3+7 = 10 < 11 , 结果偏小了 。
【如何在数组中找到和为“特定值”的三个数?】我们让指针j右移:
如何在数组中找到和为“特定值”的三个数?文章插图
计算两指针对应元素之和 , 5+7 = 12 > 11 , 结果又偏大了 。
我们让指针k左移:
如何在数组中找到和为“特定值”的三个数?文章插图