738. 单调递增的数字 - 力扣(LeetCode)
当且仅当每个相邻位数上的数字 x 和 y 满足 x <= y 时,我们称这个整数是单调递增的。
给定一个整数 n ,返回 小于或等于 n 的最大数字,且数字呈 单调递增 。
例如:98,一旦出现strNum[i - 1] > strNum[i]的情况(非单调递增),首先想让strNum[i - 1]–,然后strNum[i]给为9,这样这个整数就是89,即小于98的最大的单调递增整数。
局部最优:遇到strNum[i - 1] > strNum[i]的情况,让strNum[i - 1]–,然后strNum[i]给为9,可以保证这两位变成最大单调递增整数。
全局最优:得到小于等于N的最大单调递增的整数。
但这里局部最优推出全局最优,还需要其他条件,即遍历顺序,和标记从哪一位开始统一改成9。
举个例子,数字:332,从前向后遍历的话,那么就把变成了329,此时2又小于了第一位的3了,真正的结果应该是299。
所以从前后向遍历会改变已经遍历过的结果!
那么从后向前遍历,就可以重复利用上次比较得出的结果了,从后向前遍历332的数值变化为:332 -> 329 -> 299
class Solution {public int monotoneIncreasingDigits(int n) {String s = n+"";char[] c = s.toCharArray();int flag = c.length;for (int i = c.length-1; i>0; i--) {if (c[i-1]>c[i]){flag = i;c[i-1]--;}}for (int i = flag; i c[i]='9';}return Integer.parseInt(String.valueOf(c));}
}
714. 买卖股票的最佳时机含手续费 - 力扣(LeetCode)
给定一个整数数组 prices,其中 prices[i]表示第 i 天的股票价格 ;整数 fee 代表了交易股票的手续费用。
你可以无限次地完成交易,但是你每笔交易都需要付手续费。如果你已经购买了一个股票,在卖出它之前你就不能再继续购买股票了。
返回获得利润的最大值。
注意:这里的一笔交易指买入持有并卖出股票的整个过程,每笔交易你只需要为支付一次手续费。
如果使用贪心策略,就是最低值买,最高值(如果算上手续费还盈利)就卖。
此时无非就是要找到两个点,买入日期,和卖出日期。
所以我们在做收获利润操作的时候其实有三种情况:
class Solution {public int maxProfit(int[] prices, int fee) {int result=0;int minPrice = prices[0];for (int i = 1; i < prices.length; i++) {if (prices[i]minPrice = prices[i];}if (prices[i]>minPrice&&prices[i]<=minPrice+fee){}if (prices[i]>minPrice+fee){result+=prices[i]-minPrice-fee;minPrice=prices[i]-fee;}}return result;}
}