赞
踩
题目链接:https://leetcode.cn/problems/unique-paths/description/
思路:求不同路径,非常简单,每个节点来自于他的左边和上边,故dp[i][j]=dp[i][j-1]+dp[i-1][j]。
class Solution {
public int uniquePaths(int m, int n) {
int[] dp = new int[n];
dp[0] = 1;
for(int i = 0; i < m; i++) {
for(int j = 1; j < n; j++) {
dp[j] = dp[j-1] + dp[j];
}
}
return dp[n-1];
}
}
题目链接:https://leetcode.cn/problems/invert-binary-tree/description/
思路:没啥好说的,前序中序后序都可以,就是交换左右子节点。
class Solution {
public TreeNode invertTree(TreeNode root) {
traverse(root);
return root;
}
void traverse(TreeNode root) {
if(root == null) return;
TreeNode t = root.left;
root.left = root.right;
root.right = t;
traverse(root.left);
traverse(root.right);
}
}
题目链接:https://leetcode.cn/problems/largest-number/description/
思路:所有的数字拼接成字符串之后的最大字符串,这里利用一个原理,两个字符串,如果x+y > y+x 那么就表示x > y,这个大于是指字符串拼接的前后顺序,更大的应该在前。
class Solution {
public String largestNumber(int[] nums) {
String[] list = new String[nums.length];
for(int i = 0; i < nums.length; i++) {
list[i] = String.valueOf(nums[i]);
}
Arrays.sort(list, (x, y) -> (y+x).compareTo(x+y));
if(list[0].equals("0")) return "0";
StringBuilder builder = new StringBuilder();
for(String s : list) {
builder.append(s);
}
return builder.toString();
}
}
题目链接:https://leetcode.cn/problems/maximum-product-subarray/description/
思路:因为有正负数,所以需要同时维护最大和最小dp数组,dp[i]表示以nums[i]为结尾的最长子数组成绩。
class Solution { public int maxProduct(int[] nums) { int[] dpMax = new int[nums.length]; int[] dpMin = new int[nums.length]; dpMax[0] = nums[0]; dpMin[0] = nums[0]; int max = nums[0]; for(int i = 1; i < nums.length; i++) { dpMax[i] = Math.max(nums[i], Math.max(nums[i] * dpMax[i-1], nums[i] * dpMin[i-1])); dpMin[i] = Math.min(nums[i], Math.min(nums[i] * dpMax[i-1], nums[i] * dpMin[i-1])); } for(int i : dpMax) { max = Math.max(max, i); } return max; } }
题目链接:https://leetcode.cn/problems/best-time-to-buy-and-sell-stock-ii/description/
思路:
因为可以不限制买卖次数,本题也可以用贪心来做,只记录今天大于昨天的差值。下面是使用动态规划来做,股票问题非常典型,即每一天都有两种状态,一是持有,二是不持有。通过维持这两个状态就可以解题。
持有的话,分为今天才持有,和之前就持有。
不持有的话,分为今天才不持有,和之前就不持有。
class Solution {
public int maxProfit(int[] prices) {
int[] dp = new int[2];
dp[0] = -prices[0];
for(int i = 1; i < prices.length; i++) {
dp[0] = Math.max(dp[0], dp[1] - prices[i]);
dp[1] = Math.max(dp[1], dp[0] + prices[i]);
}
return dp[1];
}
}
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。