对撞指针从两端向中间移动

发布时间:2025-06-24 17:50:04  作者:北方职教升学中心  阅读量:746


代码实现:

class Solution {    public int maxArea(int[] height) {        int l=0,r=height.length-1,max=0,t;        while(l<r){            if(height[l]<height[r]){                t=height[l]*(r-l);                l++;            }else{                t=height[r]*(r-l);                r--;            }            if(max<t)max=t;        }        return max;    }}


三、由于数组是有序的,我们可以利⽤「对撞指针」来优化

设最⻓边枚举到 j 位置,区间 [left, right] 是 j 位置左边的区间(也就是⽐它⼩的区间):

  • 如果 nums[left] + nums[right] > nums[i]

说明 [left, right - 1] 区间上的所有元素均可以与 nums[right] 构成⽐ nums[j] ⼤的⼆元组

则满⾜条件的有 right - left

此时 right 位置的元素的所有情况相当于全部考虑完毕, right-- ,进⼊下⼀轮判断

  •  如果 nums[left] + nums[right] <= nums[i]

说明 left 位置的元素是不可能与 [left + 1, right] 位置上的元素构成满⾜条件的⼆元组

left 位置的元素可以舍去, left++ 进⼊下轮循环

代码实现:

class Solution {    public int triangleNumber(int[] nums) {        Arrays.sort(nums);        int sum=0;        for(int j=nums.length-1;j>=2;j--){            int l=0,r=j-1;            while(l<r){                if(nums[l]+nums[r]>nums[j]){                    sum=sum+r-l;                    r--;                }else{                    l++;                }            }        }        return sum;            }}


 四、

双指针算法是一种简单而有效的算法技巧,通过维护两个指针的状态来简化问题的复杂度。

分析:

如果「从前向后」进⾏原地复写操作的话,由于 0 的出现会复写两次,导致没有复写的数「被覆
盖掉」。如果改变左边界,新的⽔⾯⾼度不确定,但是可能会超过原来左边界的柱⼦⾼度,因此容器的容积可能会增⼤。有效三⻆形的个数

题目链接

题目描述:

题目分析:

首先我们得知道,三条边能构成三角形的充要条件是:任意两边之和大于第三边。合理地运用双指针法,可以帮助我们在处理数组和字符串问题时更加高效地达成目标。盛⽔最多的容器

题目描述:

题目分析:

我们可以设两个指针 left right 分别指向容器的左右两个端点,此时容器的容积 :
v = (right - left) * min( height[right], height[left])
容器的左边界为 height[left] ,右边界为 height[right]

注意:

要判断 dest 是否越界到 n 的位置:
如果越界,执⾏下⾯三步:
  1. n - 1 位置的值修改成 0
  2. cur 向移动⼀步;
  1. dest 向前移动两步。如果有什么讲的不对的地方欢迎在评论区指出,希望能够和你们一起进步✊

  • 更新状态:在每次移动指针之后更新当前的状态,如累加、双指针算法可以显著减少时间复杂度,使其从O(n2)O(n2)降低到O(n)O(n),甚至在某些情况下可以达到O(log⁡n)O(logn)。