深圳动力网站设计公司,网络管理系统登录,永川区网站建设,中国建设银行的网站.56. 合并区间
遇到了三个问题#xff0c;一一说来#xff1a; 1 比较应该按左区间排序#xff0c;我却写了右区间。由于本题是合并区间#xff0c;判断是否连续显然是用下一个的左区间与前一个的右区间比较#xff0c;属于没想清楚了。
2 在写for循环时写成了如下的代码…56. 合并区间
遇到了三个问题一一说来 1 比较应该按左区间排序我却写了右区间。由于本题是合并区间判断是否连续显然是用下一个的左区间与前一个的右区间比较属于没想清楚了。
2 在写for循环时写成了如下的代码 但margin不应该取i1因为在这种情况下第i号的intervals实际上还没有被添加到结果集result里面所以应该是令marginintervals[i]才是对的。 for(int i0; iintervals.size(); i){if(margin[1] intervals[i][0]){margin[1] max(intervals[i][1], margin[1]);}else{result.push_back(margin);if(i ! intervals.size()-1){margin intervals[i1];}}}
3 提交后发现速度只击败了10%
换成了Lambda 表达式一下从134ms变成了7ms问了下GPT: 并且自己对lambda表达式的定义方法也还需要再熟悉。
class Solution {
public:vectorvectorint merge(vectorvectorint intervals) {sort(intervals.begin(), intervals.end(), [](vectorint val1, vectorint val2) {return val1[0] val2[0];});vectorint margin intervals[0];vectorvectorint result;for(int i1; iintervals.size(); i){if(margin[1] intervals[i][0]){margin[1] max(intervals[i][1], margin[1]);}else{result.push_back(margin);margin intervals[i];}}result.push_back(margin);return result;}
738.单调递增的数字
没看解析前自己想的方法逻辑有漏洞还以为结果不是原始的n就是x999但实际上并非如此
实际上的规则应该是从哪一位开始违反递增规则就把其后面的数全都置为9并且将当前位置元素值-1然后当前位置元素值发生变化有可能会影响与前面元素的大小关系。因此这使得遍历顺序需要从后往前。
看完了解析后自己写了一版只能用麻烦来形容
class Solution {
public:int monotoneIncreasingDigits(int n) {dequeint nums;int slice n;int cur 0;int pre 9;while(slice 0){ cur slice - int(slice/10)*10;slice slice/10;if(pre cur){for(int i0; inums.size(); i){nums[i] 9;}nums.push_front(cur-1);pre cur - 1;}else{nums.push_front(cur);pre cur;}}int result 0;int length nums.size();for(int i0; ilength; i){result result*10 nums[i];}return result;}
};
主要麻烦在了2个方面 1 没把int直接转string如果转了的话不仅可以直接访问每一位对应的值还可以直接通过s.size(知道这个数有几位这些都是int无法做到的。我直接用int写多写了很多才达到相同效果包括获取每一位的代码以及最后转回int的代码都要比str费事。
2 每次发现一个位置不行的时候不需要立刻在原处就执行一遍9的替换和当前位置-1因为前面的位置上还有可能出状况现在做了替换很有可能是白干。只要用一个参数记录最靠前的出问题的位置然后这个位置-1后面全用9替换即可。这样做下来确实思路更清晰更好。