面试基础-数组相关

题目描述(二分查找升级版),牛客网算法题

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

 

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值