双指针主要运用在数组中和链表中,初始时用于指向各自元素,之后通过某一条件使得当两个指针满足某一关系条件时,进行的筛选。
(1)看例题:
(2)算法思想
因为这里讲述的是数组的双指针用法,因此该算法思想主要运用数组双指针的方法去处理。可以看到,我们的目标是找到两数之和使得其值为所要求的target,如何实现呢?暴力的一个一个去试不失为一个办法,但是非常暴力,且时间复杂度也高出很多。换个思维,能不能通过一些办法来事先筛选掉一些从而减少相加次数呢?答案就是排序,通过排序我们可以保证元素是升序或者是降序的,在此基础上,若有两数之和大于或者小于target,则可以相应的移动指针进行下一个筛选,而这样的效率是比直接两两相加是快的多的。
(3)代码实现
class Solution {
public int[] twoSum(int[] nums, int target) {
int i=0,j=nums.length-1;//定义两个指针,分别指向数组开端与末尾
int k,l;//用于后面得出两个指针的下标
int[] numscopy=nums.clone();//copy一个nums数组,并命名为numscopy
Arrays.sort(numscopy);//对numscopy进行排序
while(i<j){
if(i<j&&numscopy[i]+numscopy[j]>target){
j--;//若前+后>目标数,则将后往前移动一个单位
}
if(i<j&&numscopy[i]+numscopy[j]<target){
i++;//若前——后<目标数,则将前往后移动一个单位
}
if(i<j&&numscopy[i]+numscopy[j]==target){
break;//找到目标数,跳出循环
}
// int[] arr={a,b};
}
for(k=0;k<nums.length;k++){
if(nums[k]==numscopy[i])
break;//在原数组nums中找到与numscopy中相对于的数组元素,找到后跳出,并得到k下标
}
for(l=0;l<nums.length;l++){
if(l!=k&&nums[l]==numscopy[j])//在原数组nums中找到与numscopy中相对于的数组元素,还要保证与另一个元素不能相等(不然就变成同一个坐标了)找到后跳出,并得到l下标,还
break;
}
return new int[]{k,l};//返回一个数组,元素为k和l
}
}