代码随想录训练营第31天 || 56. 合并区间 738. 单调递增的数字
56. 合并区间
讲解:代码随想录
思路:
与之前射气球的题很像,也是先用左右边界的一个边界排序,再判断是否重叠。左边界排序,使用正序进行遍历,右边界排序逆序进行遍历,原因是左边界排序,最左边的左边界一定是最小的,但右边界不一定,同理右边界。
代码:
class Solution:
def merge(self, intervals: List[List[int]]) -> List[List[int]]:
result = []
if len(intervals)==0:
return result
intervals.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类型