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 maer 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)