• 双指针算法


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






  • 相关阅读:
    UML 类与类之间的关系
    HTTP协议基础
    LDAP介绍
    UML 类与类之间的关系
    我的桌面
    RoR的OO与敏捷[1][88250原创]
    Ubuntu7.10纯仿Leopard[00原创]
    37个我爱Ruby的理由
    在Ubuntu 7.10上安装Rails[00整理]
    RoR的OO与敏捷[1][88250原创]
  • 原文地址:https://www.cnblogs.com/wxc1/p/15005613.html
Copyright © 2020-2023  润新知