题单介绍:
精选 100 道力扣(LeetCode)上最热门的题目,适合初识算法与数据结构的新手和想要在短时间内高效提升的人,熟练掌握这 100 道题,你就已经具备了在代码世界通行的基本能力。
目录
题单介绍:
题目:56. 合并区间 - 力扣(Leetcode)
题目的接口:
解题思路:
代码:
过过过过啦!!!!
题目:62. 不同路径 - 力扣(Leetcode)
题目的接口:
解题思路:
代码:
过过过过啦!!!!
写在最后:
题目:56. 合并区间 - 力扣(Leetcode)
题目的接口:
class Solution {
public:
vector<vector<int>> merge(vector<vector<int>>& intervals) {
}
};
解题思路:
这道题也不难,就是一个简单的更新边界,
我就直接根据题意,
如果左边界小就更新左边界,
如果右边界大就更新右边界,
如果上一个数的右边界 < 当前数的左边界,证明证明区间结束了,
一开始这样写没过,
发现,题目给的数是无序的,在前面sort一下就行,这个规律只适合升序排列
另外我这种方法写的,最后一组区间会漏掉,最后处理一下就行。
代码如下:
代码:
class Solution {
public:
vector<vector<int>> merge(vector<vector<int>>& intervals) {
vector<vector<int>> vv;
if(intervals.empty()) return vv;
sort(intervals.begin(), intervals.end()); //排序
int left = INT_MAX, right = -1; //确保第一次进入逻辑的时候能更新left和right
for(int i = 0; i < intervals.size(); i++) { //遍历
if(right != -1 && right < intervals[i][0]) { //第一次不进来,如果上一个数的右边界 < 这个数的左边界,证明证明区间结束了
vector<int> v{left, right}; //插入区间
vv.push_back(v);
left = intervals[i][0]; //开始计算新的区间
right = intervals[i][1];
}
if(intervals[i][0] < left) left = intervals[i][0]; //如果左边界小就更新左边界
if(intervals[i][1] > right) right = intervals[i][1]; //如果右边界大就更新右边界
}
vector<int> v{left, right}; //处理最后一组区间
vv.push_back(v);
return vv;
}
};
过过过过啦!!!!
题目:62. 不同路径 - 力扣(Leetcode)
题目的接口:
class Solution {
public:
int uniquePaths(int m, int n) {
}
};
解题思路:
这道题我一眼看过去,就感觉可以用搜索做,
但是很显然题目的时间复杂的要求不让,
只能使用动态规划来做,不过这道题是简单动态规划,我也来尝试一下,
根据题目我们可以知道,一个格子的路径数量是由他上面和左边的格子决定的,
所以我们其实就可以写出动态规划的转移方程:
dp[ i ][ j ] = dp[ i - 1 ][ j ] + dp[ i ][ j - 1 ];
不过要确保第一行第一列都是从1开始。
代码如下:
代码:
class Solution {
public:
int uniquePaths(int m, int n) {
vector<vector<int>> dp(m, vector<int>(n, 1)); //初始化成1,满足条件
for(int i = 1; i < m; i++) {
for(int j = 1; j < n; j++) {
dp[i][j] = dp[i - 1][j] + dp[i][j - 1]; //推出的状态转移方程
}
}
return dp[m - 1][n - 1];
}
};
过过过过啦!!!!
写在最后:
以上就是本篇文章的内容了,感谢你的阅读。
如果感到有所收获的话可以给博主点一个赞哦。
如果文章内容有遗漏或者错误的地方欢迎私信博主或者在评论区指出~