对撞指针从两端向中间移动
发布时间: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; }}
四、
双指针算法是一种简单而有效的算法技巧,通过维护两个指针的状态来简化问题的复杂度。
分析:
题目链接
题目描述:
题目分析:
首先我们得知道,三条边能构成三角形的充要条件是:任意两边之和大于第三边。合理地运用双指针法,可以帮助我们在处理数组和字符串问题时更加高效地达成目标。盛⽔最多的容器
题目描述:
题目分析:
v = (right - left) * min( height[right], height[left])
注意:
要判断 dest 是否越界到 n 的位置:如果越界,执⾏下⾯三步:
- n - 1 位置的值修改成 0 ;
- cur 向移动⼀步;
- dest 向前移动两步。如果有什么讲的不对的地方欢迎在评论区指出,希望能够和你们一起进步✊