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,其中 k ≤ 33,返回楊輝三角的第 k 行。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; } }