zoukankan      html  css  js  c++  java
  • 算法练习之杨辉三角,杨辉三角的第 k 行,买卖股票的最佳时机

    1. 杨辉三角

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

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

    示例:
    输入: 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;
        }
    }
  • 相关阅读:
    一些比较水的题目
    oracle not in,not exists,minus 数据量大的时候的性能问题
    简单的oracle分页语句
    oracle 查询结果集运算
    Spring注解详解
    HTTP报头Accept 和 Content-Type的区别
    vue 实现分转元的 过滤器
    oracle or语句的坑
    CSS样式 让你的输入的小写自动变成大写。
    js 十分精确身份证验证
  • 原文地址:https://www.cnblogs.com/baby123/p/10954695.html
Copyright © 2011-2022 走看看