今天的三道题都是有难度的题目
738:单调递增的数字
这里有一个思想,就是从后往前遍历,当前一个大于后一个时让前一个减一然后记住当前的坐标让后边全部为9,这道题的难点对于Java来说在于代码
public int monotoneIncreasingDigits(int N) {
String[] strings = (N + "").split("");
int start = strings.length;
for (int i = strings.length - 1; i > 0; i--) {
if (Integer.parseInt(strings[i]) < Integer.parseInt(strings[i - 1])) {
strings[i - 1] = (Integer.parseInt(strings[i - 1]) - 1) + "";
start = i;
}
}
for (int i = start; i < strings.length; i++) {
strings[i] = "9";
}
return Integer.parseInt(String.join("",strings));
}
先是分割,然后是遍历最后是拼接,se基础不好很可能做不出来
714题:买卖股票的最佳时机含手续费
动态规划问题,我没有搞明白。
但是看着代码的逻辑是设置两个状态,持有和卖出,然后找这个的最大利润一直更新
这个思路是力扣里的大神的
作者:Sweetiee 🍬
链接:https://leetcode.cn/problems/best-time-to-buy-and-sell-stock-with-transaction-fee/solutions/524733/jian-dan-dpmiao-dong-gu-piao-mai-mai-by-tejdo/
来源:力扣(LeetCode)
思路解析
这是一道入门的动态规划的题目。题目与 「秒懂 122. 买卖股票的最佳时机 II」 相比,只是多了 “手续费”。
一般的动态规划题目思路三步走:
定义状态转移方程
给定转移方程初始值
写代码递推实现转移方程
代码如下:
public int maxProfit(int[] prices, int fee) {
int n = prices.length;
int[][] dp = new int[n][2];
dp[0][0] = 0;
dp[0][1] = -prices[0];
for (int i = 1; i < n; i++) {
dp[i][0] = Math.max(dp[i - 1][0], dp[i - 1][1] + prices[i] - fee);
dp[i][1] = Math.max(dp[i - 1][1], dp[i - 1][0] - prices[i]);
}
return dp[n - 1][0];
}
968:监控二叉树
难题,自己很难想出来的题属于是,首先确定遍历顺序是后序遍历,然后给每个节点一个状态值,根据不同的状态分类讨论,这里还有一个小细节,就是当未被覆盖的状态和被覆盖的状态同时存在于两个字节的时优先考虑那个未被覆盖代码如下:
int res = 0;
public int minCameraCover(TreeNode root) {
if(tool(root)==0)res++;
return res;
}
public int tool(TreeNode root){
if(root==null)return 2;
int left = tool(root.left);
int right = tool(root.right);
if(left==2&&right==2)return 0;
if(left==0||right==0){
res++;
return 1;
}
if(left==1||right==1)return 2;
return -1;
}