[七日打卡]之第十卡路径总和、杨辉三角、杨辉三角II、买卖股票的最佳时机、买卖股票的最佳时机II

278 阅读1分钟

路径总和

使用递归。

基准条件:如果当前节点的左子树与右子树都为null,即当前子节点是终点,判断当前节点的val是否与targetSum-前面所有节点的val相等。

如果当前节点有子节点,继续递归。

不用判断targetSum-root.val是否为负值。

class Solution {
    public boolean hasPathSum(TreeNode root, int targetSum) {
        if (root == null) {
            return false;
        }

        if (root.left == null && root.right == null) {
            return targetSum == root.val;
        }

        return hasPathSum(root.left, targetSum - root.val) || hasPathSum(root.right, targetSum - root.val);
    }
}

杨辉三角

每一行的首尾都是1,除此之外其他第j个元素为上一行的第j-1个元素与第j个元素之和。

由此,我们写出简单的算法。

注意:在java的list中,如果使用list.add(index,element)方法时,如果index!=0,一定要保证index-1个元素不为null。

同时,需要注意list.add(index,element)方法与list.set(index,element)方法的区别。

class Solution {
    public List<List<Integer>> generate(int numRows) {
        List<List<Integer>> result = new ArrayList<>();

        for (int i = 0; i < numRows; i++) {
            List<Integer> list = new ArrayList<>();
            list.add(0, 1);
            for (int j = 1; j < i; j++) {
                list.add(j, result.get(i - 1).get(j - 1) + result.get(i - 1).get(j));
            }
            if (i > 0) {
                list.add(i, 1);
            }
            result.add(list);
        }
        return result;
    }
}

杨辉三角II

这道题我们需要理解的知识点是:杨辉三角的每一行(第N行)的每一个元素是Cn1,Cn2 。。。 直到Cnn。

  • 同时,第K项等于第K-1项乘以(n-k+1)/k 。
class Solution {
   public List<Integer> getRow(int rowIndex) {
       int N = rowIndex;
       List<Integer> list = new ArrayList<Integer>();

       long pre = 1;
       list.add((int) pre);
       for (int K = 1; K <= N; K++) {
           long tmp = pre * (N - K + 1) / K;
           list.add((int) tmp);
           pre = tmp;
       }
       return list;
   }
}

买卖股票的最佳时机

定义一个变量min,用来记录数组中的最小值。

定义一个变量tmp记录前一个元素与最小值的差价。

如果当前的元素与最小值的差价大于tmp,则赋值给tmp。

class Solution {
    public int maxProfit(int[] prices) {
        int min = Integer.MAX_VALUE;
        int tmp = 0;

        for (int i = 0; i < prices.length; i++) {
            if (prices[i] < min) {
                min = prices[i];
            }

            tmp = tmp < prices[i] - min ? prices[i] - min : tmp;
        }
        return tmp;
    }
}

买卖股票的最佳时机II

记住一点:只要今天比昨天赚钱就卖,到最后肯定稳赚不赔。

class Solution {
    public int maxProfit(int[] prices) {
        int ans = 0;
        for (int i = 1; i < prices.length; i++) {
            ans += prices[i] - prices[i - 1] > 0 ? prices[i] - prices[i - 1] : 0;
        }
        return ans;
    }
}