双指针算法基础

双指针指的是在遍历对象的过程中,不是普通的使用单个指针进行访问,而是使用两个相同方向(快慢指针)或者相反方向(对撞指针)的指针进行扫描,从而达到相应的目的。

1:对撞指针
对撞指针是指在数组中,将指向最左侧的索引定义为左指针(left),最右侧的定义为右指针(right),然后从两头向中间进行数组遍历。快速排序就是典型的双指针问题。

例(1) : 救生艇问题

function numRescueBoats(people,limit){
	people.sort((a,b) => a - b)
	let ans = 0;
	let left = 0;
	let right = people.length - 1;

	while(left <= right){
		if (people[left] + people[right] <= limit) {
			left ++;
		}
		right --;
		ans ++;
	}
	return ans;
}

例(2): 接雨水问题

function getRainVlume3(height){
	let ans = 0;
	let left = 0;
	let right = height.length-1;
	while(left <= right){
		let myAns = Math.min(height[left],height[right])*(right-left)
		ans = Math.max(ans,myAns)
		if (height[left] < height[right]) {
			left ++;
		}else {
            right --;
		}
	}
	return ans;
}

2:快慢指针
快慢指针是两个指针从同一侧开始遍历数组,将这两个指针分别定义为快指针(fast)和慢指针(slow),两个指针以不同的策略移动,直到两个指针的值相等(或其他特殊条件)为止,如快指针(fast)每次增长两个,慢指针(slow)每次增长一个。一般来说快慢指针常用于判断链表等数据结构中是否有环。
例子 : 环形链表


```javascript
function hasCycle(head){
 	let fast = head;
  	let slow = head;
  	while (fast) {                        
    	if (fast.next == null) return false; 
    	slow = slow.next;                 
    	fast = fast.next.next;             
    	if (slow == fast) return true;   
  	}
  	return false;   
}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

全栈游戏开发

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

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

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

打赏作者

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

抵扣说明:

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

余额充值