题目描述(二分查找升级版),牛客网算法题
1.在一个二维数组中(每个一维数组的长度相同),每一行都按照从左到右递增的顺序排序,每一列都按照从上到下递增的顺序排序。请完成一个函数,输入这样的一个二维数组和一个整数,判断数组中是否含有该整数。
思路:
数组为有序数组,可以采用类似二分查找发进行;从左下角或者右上角切入,逐渐降数组缩小,循环查找
<?php
function Find($target, $array)
{
// write code here
$row = count($array);
$column = count($array[0]);
$i = 0;
$j = $column -1;
while($i < $row && $j >= 0){
if($target == $array[$i][$j])
return true;
if($target>$array[$i][$j]){
$i += 1;
continue;
}
if($target < $array[$i][$j])
{
$j -=1;
continue;
}
}
return false;
}
2.把一个数组最开始的若干个元素搬到数组的末尾,我们称之为数组的旋转。 输入一个非减排序的数组的一个旋转,输出旋转数组的最小元素。 例如数组{3,4,5,1,2}为{1,2,3,4,5}的一个旋转,该数组的最小值为1。 NOTE:给出的所有元素都大于0,若数组大小为0,请返回0。
思路:两个分别有序的数组组合在一起查找,可以遍历,也可以采用二分查找,遍历更简单更容易理解
3.一个数据,经过处理之后,保证数组前半部分由计数组成,后半部分由偶数组成,并且保证奇数与基数之间,偶数与偶数之间相对位置不变。
思路1:遍历数组将奇数存入array1种,偶数存入array2中,然后将array1和array2顺序合并
思路2:(1)i从左向右遍历数组,查找第一个偶数(2)j从i+1向右遍历整个数组,查找第一个奇数,将i至j-1之间的数后移一位,把a[j]放到a[i+1]的位置。(3)直至i=array.length-1为止
4.统计一个数字在排序数组中出现的次数。
思路1:排序数组中统计k出现的次数,查找数组中第一个k和最后一个 k出现的位置,然后相减;
function GetNumberOfK($data, $k){
return findLastK - findFirstK($data,$k);
}
function findFirstK($data,$k){
}
function findLastK($data,$k){
}
思路2:查找k+0.5与k-0.5的位置,找到这两个数应该插入的位置,然后二者相减
<?php
function GetNumberOfK($data, $k)
{
return findK($data,$k+05)-findK($data-0.5); // write code here
}
function findK($data $num){
$s=0,$end=count($data)-1;
while($s<=$end){
$mid=($end-$s)/2+$s;
if($data[$mid]<$num){
$s=$mid+1;
}else if($data[$mid]>$num){
$end=$mid-1;
}
}
return $s;
}