有关数组题

2.1.6 Longest Consecutive Sequence
描述
Given an unsorted array of integers, find the length of the longest consecutive elements sequence.
For example, Given [100, 4, 200, 1, 3, 2], The longest consecutive elements sequence is [1,2, 3, 4]. Return its length: 4.
Your algorithm should run in O(n) complexity.

function f9($arr)
{
    if(false===is_array($arr)) return false;
    if(($n=count($arr))<=1) return $n;
    $hs=array_flip($arr);//将数组的key与value翻转
    $maxlog=0;
    foreach($hs as $key=>$value){
        $nkey=$key+1;
        $longe=1;
        while(array_key_exists($nkey,$hs)){//判断数组中是否存在key,bool
                $longe++;
                $nkey++;
        }
        $nkey=$key-1;
        while(array_key_exists($nkey,$hs)){

                $longe++;
                $nkey--;
        }
        if($maxlog<$longe) $maxlon=$longe;
    }
    return $maxlon;
}
利用php自带的函数array_search 不用上面那么麻烦
function f9($arr)
{
    if(false===is_array($arr)) return false;
    if(($n=count($arr))<=1) return $n;
    $maxlog=0;
    foreach($arr as $key=>$value){
        $lvalue=$value+1;
        $longe=1;
        while(false!==array_search($lvalue,$arr)){
            $longe++;
            $lvalue++;
        }
        $lvalue=$value-1;
        while(false!==array_search($lvalue,$arr)){
            $longe++;
            $lvalue--;
        }
        if($maxlog<$longe) $maxlon=$longe;
    }
    return $maxlon;
}
c++中可以使用vector<>  find函数

2.1.10 Remove Element
描述
Given an array and a value, remove all instances of that value in place and return the new length.The order of elements can be changed. It doesn’t maer what you leave beyond the new length.

//时间复杂度:o(n)使用php自带的函数 array array_keys($arr,$value)找到数组中值为$value对应的键值,存在多个返回数组,不存在则true
function removeV($arr,$value)
{
   if(false===is_array($arr)) return false;
   $brr=array_keys($arr,$value);
   if(false===$brr)  return count($arr);  
   foreach($brr as $key=>$val){
        unset($arr[$val]);
    }
  return count($arr);
}
//时间复杂度:o(n),
function removeV($arr,$value)
{
   if(false===is_array($arr)) return false;
   $n=count($arr);
   $index=0;
   for($i=0;$i<$n;++$i){
        if($arr[$i]!=$value)
              $arr[$index++]=$arr[$i];
   }
   return $index;
}

2.1.16 Plus One
描述
Given a number represented as an array of digits, plus one to the number.

function plusOne(&$arr)
{
   if(false===is_array($arr)) return false;
   $addNum=0;
   $yu=1;
   foreach( $arr as $key=>$value ){
       $value+=$addNum+$yu;        
       $yu=$value/10;
       $value=$value%10;
       $arr[$key]=$value;//注意改变$value 不会影响数组的$arr大小。
   }   
}

3.4 Add Binary
描述
Given two binary strings, return their sum (also a binary string).
For example,
a = “11”
b = “1”
Return ”100.

function addBin($a,$b)
{
    if(empty($a)&&empty($b)) return NULL;
    if(empty($a)) return $b;
    if(empty($b))  return $a;
    $arr=str_split(strrev($a));
    /*
    注意将字符串直接强制赋给数组$str=111=>array(0=>'111');
    得使用str_split转为array(0=>'1';1=>'1';2=>'1'); 
    */
    $brr=str_split(strrev($b));
    $n=count($arr); $m=count($brr);
    $yu=0;
    $newstr=null;//为空
    $maxn=$n<$m?$m:$n;
    for($i=0;$i<$maxn;++$i)
    {
        $ar=$i<$n?$arr[$i]:0;
        $br=$i<$m?$brr[$i]:0;
        $value=$ar+$br+$yu;
        $yu=$value/2;
        $newstr.=$value%2;
    }
    var_dump($newstr);
    return strrev($newstr);
}

2.1.17 Climbing Stairs
描述
You are climbing a stair case. It takes n steps to reach to the top.
Each time you can either climb 1 or 2 steps. In how many distinct ways can you climb to the top?
分析
设f(n) 表示爬n 阶楼梯的不同方法数,为了爬到第n 阶楼梯,有两个选择:
. 从第n … 1 阶前进1 步;
. 从第n … 1 阶前进2 步;
因此,有f(n) = f(n -1) + f(n-2)。
这是一个斐波那契数列。也是动态规划中的一种

常见的写法:是从上往下
function calWays($n)
{
   if($n==0) return 0;
   if($n==1) return 1;
   if($n==2) return 2;   
   return calWay($n-1)+calWay($n-2);
}
但是这种方法会出现重复计算的情况,如下图

这里写图片描述

浪费时间,采用从下往上的计算方法

function calWays($n)
{
   if($n==0) return 0;
   if($n==1) return 1;
   if($n==2) return 2;   
   $m=3;
   $f=array(0,1,2); 
   while($m<=$n){
       $f[$m]=$f[$m-1]+$f[$m-2];
       $m++;
   }
   return $f[$n];
}
这样减少了重复计算的次数,但是增加了空间复杂度,可以进行简化
function calWays($n)
{
   if($n==0) return 0;
   if($n==1) return 1;
   if($n==2) return 2;   
   $m=1;
   $prev=0;
   $curr=1;
   while($m<=$n){
       $temp=$curr;
       $curr+=$prev;
       $prev=$temp;
       $m++;
   }
   return $curr;
}

递归和循环(取自剑指offer)
这里写图片描述

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值