哪家网站推广好百度非企推广开户
56. 合并区间
讲解:代码随想录
思路:
与之前射气球的题很像,也是先用左右边界的一个边界排序,再判断是否重叠。左边界排序,使用正序进行遍历,右边界排序逆序进行遍历,原因是左边界排序,最左边的左边界一定是最小的,但右边界不一定,同理右边界。
代码:
class Solution:def merge(self, intervals: List[List[int]]) -> List[List[int]]:result = []if len(intervals)==0:return resultintervals.sort(key = lambda x: x[0])result.append(intervals[0])for i in range(1,len(intervals)):if intervals[i][0] <= result[-1][1]:result[-1][1]=max(intervals[i][1],result[-1][1])else:result.append(intervals[i])return result
遇到的问题:
1.对于左右边界排序的不同处理方式
738. 单调递增的数字
讲解:代码随想录
思路:
一个循环判断当前数字是否为递增数字,如果是直接返回,如果不是,就记录非递增数字的最高位,把最高位减一,然后把最高位的低位都改为9,此时就为最大递增数字
代码:
class Solution {
public:int monotoneIncreasingDigits(int n) {string strnum = to_string(n);int flag = strnum.size();for( int i =strnum.size()-1; i> 0;i--){if(strnum[i] < strnum[i-1]){flag = i;strnum[i-1]--;//此时是进行ascii码的加减,只适用于0到9的数}}for(int i =flag;i<strnum.size();i++)//flag的作用很巧妙,如果上一个循环没有进入if,也就是最大单调递增数字就是自己本身,可以直接跳过此循环。当最大单调递增数字不是自己本身时,将flag后的数字每一位调整成9{strnum[i] = '9';}return stoi(strnum);//stoi()函数作用是转化为int类型}
};
遇到的问题:
1.strnum[i-1]--;//此时是进行ascii码的加减,只适用于0到9的数
2.flag 的作用:for(int i =flag;i<strnum.size();i++)//flag的作用很巧妙,如果上一个循环没有进入if,也就是最大单调递增数字就是自己本身,可以直接跳过此循环。当最大单调递增数字不是自己本身时,将flag后的数字每一位调整成9
3.return stoi(strnum);//stoi()函数作用是转化为int类型