路径总和
使用递归。
基准条件:如果当前节点的左子树与右子树都为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;
}
}