算法练习之杨辉三角,杨辉三角的第 k 行,买卖股票的最佳时机详解编程语言

1. 杨辉三角

给定一个非负整数 numRows,生成杨辉三角的前 numRows 行。

算法练习之杨辉三角,杨辉三角的第 k 行,买卖股票的最佳时机详解编程语言

在杨辉三角中,每个数是它左上方和右上方的数的和。

示例: 
输入: 5 
输出: 
[ 
     [1], 
    [1,1], 
   [1,2,1], 
  [1,3,3,1], 
 [1,4,6,4,1] 
]

java

class Solution { 
    public List<List<Integer>> generate(int numRows) { 
        List<List<Integer>> rs = new ArrayList<List<Integer>>(); 
        List<Integer> prior = null; 
        for(int i=1;i<=numRows;i++){ 
            List<Integer> tmp = new ArrayList<>(); 
            for(int j=0;j<i;j++){ 
                if(j==0||j==i-1){ 
                    tmp.add(1); 
                }else{ 
                    tmp.add(prior.get(j-1)+prior.get(j)); 
                } 
            } 
            rs.add(tmp); 
            prior = tmp; 
        } 
        return rs; 
    } 
}

php

class Solution { 
 
    /** 
     * @param Integer $numRows 
     * @return Integer[][] 
     */ 
    function generate($numRows) { 
        $rs = []; 
        for($i=1;$i<=$numRows;$i++){ 
            $tmp = []; 
            for($j=0;$j<$i;$j++){ 
                if($j==0||$j==$i-1){ 
                    array_push($tmp,1); 
                }else{ 
                    array_push($tmp,$rs[$i-2][$j-1]+$rs[$i-2][$j]); 
                } 
            } 
            array_push($rs,$tmp); 
        } 
        return $rs; 
    } 
}

2.杨辉三角的第 

给定一个非负索引 k,其中 k ≤ 33,返回杨辉三角的第 行。

示例: 
输入: 3 
输出: [1,3,3,1]

直接使用组合公式

C(n,i) = n!/(i!*(n-i)!)

则第(i+1)项是第i项的倍数=(n-i)/(i+1);

java

class Solution { 
    public List<Integer> getRow(int rowIndex) { 
        List<Integer> rs= new ArrayList<>(); 
        long  m = 1; 
        for(int i=0;i<=rowIndex;i++){ 
            rs.add((int)m); 
            m = m*(rowIndex-i)/(i+1); 
        } 
        return rs; 
    } 
}

注:

  m不能为int,会发生溢出

php

class Solution { 
 
    /** 
     * @param Integer $rowIndex 
     * @return Integer[] 
     */ 
    function getRow($rowIndex) { 
        $m = 1; 
        $rs = []; 
        for($i=0;$i<=$rowIndex;$i++){ 
            array_push($rs,(int)$m); 
            $m = $m*($rowIndex-$i)/($i+1); 
        } 
        return $rs; 
    } 
}

 3.买卖股票的最佳时机

(1)给定一个数组,它的第 i 个元素是一支给定股票第 i 天的价格。

如果你最多只允许完成一笔交易(即买入和卖出一支股票),设计一个算法来计算你所能获取的最大利润。

示例 1: 
输入: [7,1,5,3,6,4] 
输出: 5 
解释: 在第 2 天(股票价格 = 1)的时候买入,在第 5 天(股票价格 = 6)的时候卖出,最大利润 = 6-1 = 5 。 
     注意利润不能是 7-1 = 6, 因为卖出价格需要大于买入价格。 
 
示例 2: 
输入: [7,6,4,3,1] 
输出: 0 
解释: 在这种情况下, 没有交易完成, 所以最大利润为 0。

java

class Solution { 
    public int maxProfit(int[] prices) { 
        if(prices.length==0) return 0; 
        int min = prices[0]; 
        int max = 0; 
        for(int i=1;i<prices.length;i++){ 
            if(prices[i]<min){ 
                min = prices[i]; 
            }else if(prices[i]-min>max){ 
                max = prices[i]-min; 
            } 
        } 
        return max; 
    } 
}

php

class Solution { 
 
    /** 
     * @param Integer[] $prices 
     * @return Integer 
     */ 
    function maxProfit($prices) { 
         
        $min = max($prices); 
        $max = 0; 
        foreach ($prices as $key => $value) { 
            if($value<$min){ 
                $min = $value; 
            }else if($value-$min>$max){ 
                $max = $value-$min; 
            } 
        } 
        return $max; 
    } 
}

(2)给定一个数组,它的第 i 个元素是一支给定股票第 i 天的价格。

设计一个算法来计算你所能获取的最大利润。你可以尽可能地完成更多的交易(多次买卖一支股票)。

注意:不能同时参与多笔交易(必须在再次购买前出售掉之前的股票)。

示例 1: 
输入: [7,1,5,3,6,4] 
输出: 7 
解释: 在第 2 天(股票价格 = 1)的时候买入,在第 3 天(股票价格 = 5)的时候卖出, 这笔交易所能获得利润 = 5-1 = 4 。 
     随后,在第 4 天(股票价格 = 3)的时候买入,在第 5 天(股票价格 = 6)的时候卖出, 这笔交易所能获得利润 = 6-3 = 3 。 
 
示例 2: 
输入: [1,2,3,4,5] 
输出: 4 
解释: 在第 1 天(股票价格 = 1)的时候买入,在第 5 天 (股票价格 = 5)的时候卖出, 这笔交易所能获得利润 = 5-1 = 4 。 
     注意你不能在第 1 天和第 2 天接连购买股票,之后再将它们卖出。 
     因为这样属于同时参与了多笔交易,你必须在再次购买前出售掉之前的股票。 
 
示例 3: 
输入: [7,6,4,3,1] 
输出: 0 
解释: 在这种情况下, 没有交易完成, 所以最大利润为 0。

java

class Solution { 
    public int maxProfit(int[] prices) { 
        if(prices.length==0||prices.length==1) return 0; 
        int max = 0; 
        for(int i =0;i<prices.length-1;i++){ 
            if(prices[i]<prices[i+1]) 
                max += prices[i+1]-prices[i];  
        } 
        return max; 
    } 
}

php

class Solution { 
 
    /** 
     * @param Integer[] $prices 
     * @return Integer 
     */ 
    function maxProfit($prices) { 
        if(count($prices)==0||count($prices)==1) return 0; 
        $max = 0; 
        for($i=0;$i<count($prices)-1;$i++) { 
            if($prices[$i]<$prices[$i+1]){ 
                $max = $max+$prices[$i+1]-$prices[$i]; 
            } 
        } 
        return $max; 
    } 
}

原创文章,作者:Maggie-Hunter,如若转载,请注明出处:https://blog.ytso.com/20354.html

(0)
上一篇 2021年7月19日
下一篇 2021年7月19日

相关推荐

发表回复

登录后才能评论