leetcode 二分法试题总结(php版本)

力扣icon-default.png?t=MBR7https://leetcode.cn/problems/search-insert-position/

该题目要求 log(n) 的解法,很显然用二分法很合适

<?php

class Solution {

    /**
     * @param Integer[] $nums
     * @param Integer $target
     * @return Integer
     */
    function searchInsert($nums, $target) {
        $low = 0;
        $high = count($nums) - 1;
        while($low <= $high) {
            $mid = $low + (($high - $low) >> 1);
            if($nums[$mid] > $target) {
                // [$left, $mid) 之间
                $high = $mid - 1;
            } elseif($nums[$mid] < $target) {
                // ($mid, $high) 之间
                $low = $mid + 1;
            } else {
                return $mid;
            }
        }
        return $low;
    }
}

$s = new Solution();

$ret = $s->searchInsert([1,3,5,6], 5);
var_dump($ret);

assert($ret == 2);

$ret = $s->searchInsert([1,3,5,6], 2);

assert($ret == 1);

// $ret = $s->searchInsert([1,3,5,6], 7);

// assert($ret == 4);

 

力扣icon-default.png?t=MBR7https://leetcode.cn/problems/first-bad-version/

 

这个题的左右指针边界需要特殊注意

<?php

class VersionControl {

    public $totalVersionNumber = 1;

    public function setTotalVersionNumber(int $n) {
        $this->totalVersionNumber = $n;
    }

    public function getTotalVersionNumber():int {
        return $this->totalVersionNumber;
    }

    public function isBadVersion($n) {
        if($this->getTotalVersionNumber() == 5) {
            if($n > 3) return true;
            return false;
        }
        if($this->getTotalVersionNumber() == 1) {
            return false;
        }
    }
}


class Solution extends VersionControl {
    /**
     * @param int $n
     * @return int
     */
    function firstBadVersion1($n) {

        $this->setTotalVersionNumber(5);
        if($n == 1) return 1;
        $low = 0;
        $high = $n;
        while($low <= $high) {
            $mid = $low + (($high - $low) >> 1);
            $midIsBad = $this->isBadVersion($mid);
            $beforeIsOk = $mid == 1 || !$this->isBadVersion($mid - 1);
            if($midIsBad && $beforeIsOk) {
                return $mid;
            }
            if($midIsBad) {
                $high = $mid -1;
            } else {
                $low = $mid + 1;
            }
        }
        return 1;
    }

    function firstBadVersion($n) {

        $this->setTotalVersionNumber(5);
        if($n == 1) return 1;
        $low = 1;
        $high = $n;
        while($low < $high) {
            $mid = $low + (($high - $low) >> 1);
            if($this->isBadVersion($mid)) {
                $high = $mid;
            } else {
                // 版本正确, 向前退一个版本
                $low = $mid + 1;
            }
        }
        return $low;
    }
}

$s = new Solution();

$ret = $s->firstBadVersion(4);
var_dump($ret);

assert($ret == 4);

$ret = $s->firstBadVersion(1);

assert($ret == 1);

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值