1.前言本文主要介绍第二类题型的双指针技巧:预处理数组后,再使用双指针遍历。在中等难度的题目中,此类问题可以归纳为K-Sum问题:两个数的和:[881.救生艇];三个数字的总和:[16.最接近的三个数字之和],[15。三个数字的总和],[923。三数之和的多种可能性];船可以承载的最大重量是有限的。每艘船最多可以同时载两个人,但条件是这些人的重量总和最多为极限。返回运载每个人所需的最少船数。(保证每个人都在船上)。从题意可以看出,保证最少需要的船数,就是每次行程尽可能载两个人,他们的重量最接近最大重量,这样后面的行程可以由两个人组成人们。解决问题的关键是在每一遍中尽可能多地从数组中找出和值小于最大权值的最大值和最小值的二元组。然后对数组进行排序和预处理后,很容易从左边找到最小值,从右边找到最大值,然后将双指针遍历到中间即可解决问题。3.16.最接近的三个数的和给定一个包含n个整数的数组nums和一个目标值target。找到nums中的三个整数,使它们的和最接近目标。返回这三个数字的总和,假设每组输入只有一个答案。天真的解决方案是通过三层循环枚举各种排列来找到最接近的总和值,时间复杂度为O(n^3)。这里我们可以利用降维的思想将其转化为两个数相加的问题,那么求解该问题的思路就和[881.Lifeboat]:时间复杂度降低为O(nlogn+n^2)。4.15.三数之和给定一个包含n个整数的数组nums,判断nums中是否存在a,b,c三个元素使得a+b+c=0?找出所有满足条件且不重复的三元组。有了上面题目的铺垫,再看这个问题,会不会出现下面的解题范式:降维思维,将三个数之和转化为两个数之和的问题;对数组进行排序,将双循环问题转化为单循环问题;对于三元组不重复的情况,同学们可能会马上想到用HashTable去重,但是在整个双指针问题的求解过程中,三个数始终保持着非递减序列的特性,那么如果遇到重复数,略过:参考视频:传送门五,923,三个数之和有很多种可能。给定一个整数数组A和一个整数target作为目标值,返回满足i
