我们在解决查找问题时有一个方法是双指针法:
考虑这样一个问题:在一个排序数组中查找两个数的和是一个特定的数sum
我们有一个o(1)的方法就是设两个指针left与right,开始left=0,right=数组长度-1;
那么
while(left<right){
如果left的值与right的值之和<sum,left++;
如果left与right的和>sum,right–;
如果==sum,返回
}
这就是双指针法。
那么我们看一道题目leetcode–3sum closet
我开始用的算法时间复杂度比较高,后来转而使用双指针法,将问题化为O(n^2)的算法。
class Solution {
public int threeSumClosest(int[] nums, int target) {
int i=0,len=nums.length,l,r,ans=nums[0]+nums[1]+nums[2],min=Math.abs(ans-target);
Arrays.sort(nums);
while(i<len) {
l=i+1;
r=len-1;
while(l<r) {
if(Math.abs(nums[i]+nums[l]+nums[r]-target)<=min) {
min=Math.abs(nums[i]+nums[l]+nums[r]-target);
ans=nums[i]+nums[l]+nums[r];
if(min==0)
return ans;
}
if(nums[i]+nums[l]+nums[r]<target)
l++;
else if(nums[i]+nums[l]+nums[r]>target)
r--;
}
i++;
}
return ans;
}
}