算法練習之楊輝三角,楊輝三角的第 k 行,買賣股票的最佳時機

1. 楊輝三角php

給定一個非負整數 numRows,生成楊輝三角的前 numRows 行。java

在楊輝三角中,每一個數是它左上方和右上方的數的和。算法

示例:
輸入: 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;
    }
}

phpspa

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,返回楊輝三角的第 行。code

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

直接使用組合公式blog

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

則第(i+1)項是第i項的倍數=(n-i)/(i+1);索引

javaip

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;
    }
}
相關文章
相關標籤/搜索