今日题目:
今日总结
今天题目没啥说的,968暂时跳过。主要是总结这几天的贪心题目,尽管贪心没有啥固定套路。
738. 单调递增的数字
要点
- 也不算难题。想清楚贪心的流程。
- 从后往前遍历,因为后面的数字应该较大。当发现前一位大于后一位时,便将前一位自减1,然后把之后所有数字设置为9,这样就能确保当高位变化时,合成的数字尽可能大。
代码:
func monotoneIncreasingDigits(n int) int {
s := strconv.Itoa(n)//将数字转为字符串,方便使用下标
ss := []byte(s)//将字符串转为byte数组,方便更改。
size := len(ss)
if size <=1 {
return n
}
for i := size-1;i>0;i--{
if ss[i-1] > ss[i] {
ss[i-1] -= 1
for j := i; j < size;j++ {
ss[j] = '9'
}
}
}
res, _ := strconv.Atoi(string(ss))
return res
}
968. 监控二叉树(跳过)
贪心总结
贪心的核心思想在于使用局部最优来推导全局最优。
如果发现能有局部最优并且没有反例的时候就能试试贪心。这几天的贪心涉及到求和与考虑范围最大化,可以自己举简单例子推导一下。
另外值得一提的是涉及两个维度的题目必须将维度拆分两次处理,考虑好怎么处理才不会影响另外一个维度。
重叠区间题目是有套路的,首先先进行排序,然后根据左右边界的关系来写逻辑。编写时要记住怎么写sort.slice函数。