数组中的双指针

本文介绍了双指针算法在解决数组问题中的应用,特别是在寻找两数之和等于目标值的问题上。通过排序数组并使用两个指针,从两端开始向中间遍历,根据和与目标值的关系动态调整指针,提高了查找效率。最终通过代码实现展示了如何在Java中有效地运用双指针方法解决此类问题。
摘要由CSDN通过智能技术生成

双指针主要运用在数组中和链表中,初始时用于指向各自元素,之后通过某一条件使得当两个指针满足某一关系条件时,进行的筛选。

(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
    }
}

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

蜗牛变涡流

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值