美文网首页
基础算法

基础算法

作者: 热河hot | 来源:发表于2021-02-25 11:43 被阅读0次

    1.给定一个排序数组,你需要在 原地 删除重复出现的元素,使得每个元素只出现一次,返回移除后数组的新长度。
    不要使用额外的数组空间,你必须在 原地 修改输入数组 并在使用 O(1) 额外空间的条件下完成。

    /**
     * 去除数组重复元素
     * https://leetcode-cn.com/leetbook/read/top-interview-questions-easy/x2gy9m/
     * @param $arr
     * @return int
     */
    function removeDuplicates(&$arr) {
        $index = 1;
        for ($i = 1; $i < count($arr); $i++) {
            $v1 = $arr[$i]; //快指针
            $v2 = $arr[$index - 1]; //慢指针
            //不相等的时候替换当前慢指针位置的值
            if ($v1 != $v2) {
                $arr[$index] = $arr[$i];
                $index++;
            }
    
        }
        return $index;
    }
    
    $arr = [0,0,1,1,1,2,2,3,3,4];
    removeDuplicates($arr);
    

    2.给定一个数组,它的第 i 个元素是一支给定股票第 i 天的价格。
    设计一个算法来计算你所能获取的最大利润。你可以尽可能地完成更多的交易(多次买卖一支股票)。
    注意:你不能同时参与多笔交易(你必须在再次购买前出售掉之前的股票)。

    /**
     * @param $price
     * @return int|mixed
     */
    function maxProfit($price) {
        $length = count($price);
        if ($length <= 1) {
            return 0;
        }
        $profit = 0;
        for ($i = 0; $i < $length - 1; $i++) {
            $profit += max($price[$i + 1] - $price[$i],0);
        }
    
        return $profit;
    }
    

    3.假设你正在爬楼梯。需要 n 阶你才能到达楼顶。

    每次你可以爬 1 或 2 个台阶。你有多少种不同的方法可以爬到楼顶呢?

    /**
     * 爬楼梯
     * @param $n
     * @return mixed
     */
    function climbStairs($n) {
        $arrStep = [
            2 => 2,
            1 => 1,
            0 => 0,
        ];
        for ($i = 3; $i <= $n; $i ++) {
            $arrStep[$i] = $arrStep[$i - 1] + $arrStep[$i - 2];
        }
        return $arrStep[$n];
    }
    

    4.给定一个整数数组 nums 和一个整数目标值 target,请你在该数组中找出 和为目标值 的那 两个 整数,并返回它们的数组下标。

    /**
     * hash法返回两数之和的位置
     * @param $nums
     * @param $target
     * @return array
     */
    function twoSum($nums, $target) {
        $map = [];
        foreach ($nums as $k => $v) {
            $num = $target - $v;
            if (isset($map[$num])) {
                return [$k, $map[$num]];
            }
            $map[$v] = $k;
        }
        return [];
    }
    $res = twoSum([2,4,5], 9);
    

    5.数组连续和最大

    /**
     * 连续数之和最大
     * @param $arr
     * @return mixed
     */
    function getMaxSubSum($arr) {
        $curSum = $arr[0];
        $maxSum = $arr[0];
        for ($i = 1; $i < count($arr); $i++) {
            if ($curSum > 0) {
                $curSum += $arr[$i];
            } else {
                $curSum = $arr[$i];
            }
            if ($curSum > $maxSum) {
                $maxSum = $curSum;
            }
        }
        return $maxSum;
    }
    
    $arr = [1,2,3,-3];
    $res = maxProfit($arr);
    

    相关文章

      网友评论

          本文标题:基础算法

          本文链接:https://www.haomeiwen.com/subject/eqiyfltx.html