双指针算法
1.有效的山脉数组
给定一个有效的整数数组A。如果它是有效的山脉数组就返回true,否则返回false。
数组A
A.length>=3;
在0<i<A.length-1 条件下 存在i
(1)A[0]<A[i] <....<.A[i-1]<A[i];
(2)A[i]>A[i+1]>....>A[A.length-1];
解题思路:
双指针 一个往前跑 一个从后往前跑 最终相遇在中间就可以了。
临界条件: 如果 left 或者 right 没有移动,说明是一个单调递增或者递减的数组。则依然不是删峰。
$a=[1,2,3,4,5,3,2,1];
function validMountainArray($a)
{
if(count($a)<3){
return false;
}
$left = 0;
$right = count($a)-1;
while($left < count($a)-1 && $a[$left]<$a[$left+1] ){
$left++;
}
while($right >0 && $a[$right]<$a[$right-1]){
$right--;
}
//如果left 或者 right 都在起始位置,说明不是山峰
if($left==$right && $left!=0 && $right!=count($a)-1){
return true;
}
return false;
}
print_r(validMountainArray($a));
2.无序数组 找出只有一个元素是重复的
$datas=[1,2,3,4,5,6,7,8,8,8];
function tesg($datas){
$show =0;
$first = 0;
$show = $datas[$show];
$first = $datas[$datas[$first]];
while($show!=$first){
$show = $datas[$show];/**输出的结果**/ 2 3 4 5 6 7 8
$first = $datas[$datas[$first]];/**输出的结果**/ 4 6 8 8 8 8 8
}
$pre1= 0;
$pre2= $show;
while($pre1!=$pre2){
$pre1 = $datas[$pre1];
$pre2 = $datas[$pre2];
}
return $pre1;
}
print_r(tesg($datas));
3.求链表的中间节点
思路:(1)快慢指针 show 为快指针 first 为慢指针。
(2)快指针走一步。慢指针走两步. show->next. first->next->next
(3)快指针永远都走一步 慢指针永远都走两步 慢指针走完了。快指针的走的位置就是中间节点
$head 为链表
$show= $head;
$first = $head;
// 循环
while($first!=null && $first->next!=null){
$show = $show->next;
$first = $first->next->next;
}
// first 慢指针while循环走完了
// 返回 show 快指针走到的位置就是中间节点
return $show;
public function centreNode($head){
$show = $head;
$first = $head;
while($first!=null && $first->next!=null){
$show = $show->next;
$first = $first->next->next;
}
return true;
}
4.判断脸部是否存在环
思路。快慢指针。 show 快指针 first 慢指针。 show.next == first.next.next 条件成立则返回true
public function hasCyle($head){
$show = $head;
$first = $head->next;
while($show!=$first){
if($first==null || $first->next==null){
return -1;
}
$show = $show->next;
$first= $head->next->next;
}
return true;
}
5 移除数组中指定元素 并返回数组元素长度
思路:双指针
function tes($data,$val){
$index = 0;
for($i=0;$i<count($data);$i++){
if($data[$i]!=$val){
$data[$index++] = $data[$i];
}
}
return $index;
}