Skip to content

Commit 0a57372

Browse files
authored
Merge pull request #73 from KongJHong/master
Create 057&&064 Solution[CPP]
2 parents 96e4f03 + f133edf commit 0a57372

File tree

4 files changed

+169
-0
lines changed

4 files changed

+169
-0
lines changed
Lines changed: 68 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,68 @@
1+
2+
## 插入区间
3+
### 问题描述
4+
5+
给出一个**无重叠**的 ,按照区间起始端点排序的区间列表。
6+
7+
在列表中插入一个新的区间,你需要确保列表中的区间仍然有序且不重叠(如果有必要的话,可以合并区间)。
8+
9+
```
10+
示例 1:
11+
输入: intervals = [[1,3],[6,9]], newInterval = [2,5]
12+
输出: [[1,5],[6,9]]
13+
14+
示例 2:
15+
输入: intervals = [[1,2],[3,5],[6,7],[8,10],[12,16]], newInterval = [4,8]
16+
输出: [[1,2],[3,10],[12,16]]
17+
解释: 这是因为新的区间 [4,8] 与 [3,5],[6,7],[8,10] 重叠。
18+
```
19+
20+
### 思路:
21+
22+
先插入,之后和56题合并区间一样(竟然打败了96%的人,距离top1峰差一点优化)
23+
24+
```CPP
25+
/**
26+
* Definition for an interval.
27+
* struct Interval {
28+
* int start;
29+
* int end;
30+
* Interval() : start(0), end(0) {}
31+
* Interval(int s, int e) : start(s), end(e) {}
32+
* };
33+
*/
34+
35+
bool cmp(Interval &val1,Interval &val2){
36+
return val1.start < val2.start;
37+
}
38+
39+
class Solution {
40+
public:
41+
vector<Interval> insert(vector<Interval>& intervals, Interval newInterval) {
42+
//先插进去,重复56题
43+
44+
intervals.push_back(newInterval);
45+
46+
int len = intervals.size();
47+
if(len <= 1)return intervals;
48+
49+
sort(intervals.begin(),intervals.end(),cmp);
50+
51+
vector<Interval> ans;
52+
53+
ans.push_back(intervals[0]);
54+
55+
for(int i = 1;i<len;i++){
56+
if(ans.back().end >= intervals[i].start){
57+
ans.back().end = max(ans.back().end,intervals[i].end);
58+
}
59+
else{
60+
ans.push_back(intervals[i]);
61+
}
62+
}
63+
64+
return ans;
65+
}
66+
};
67+
```
68+
Lines changed: 32 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,32 @@
1+
bool cmp(Interval &val1,Interval &val2){
2+
return val1.start < val2.start;
3+
}
4+
5+
class Solution {
6+
public:
7+
vector<Interval> insert(vector<Interval>& intervals, Interval newInterval) {
8+
//先插进去,重复56题
9+
10+
intervals.push_back(newInterval);
11+
12+
int len = intervals.size();
13+
if(len <= 1)return intervals;
14+
15+
sort(intervals.begin(),intervals.end(),cmp);
16+
17+
vector<Interval> ans;
18+
19+
ans.push_back(intervals[0]);
20+
21+
for(int i = 1;i<len;i++){
22+
if(ans.back().end >= intervals[i].start){
23+
ans.back().end = max(ans.back().end,intervals[i].end);
24+
}
25+
else{
26+
ans.push_back(intervals[i]);
27+
}
28+
}
29+
30+
return ans;
31+
}
32+
};
Lines changed: 48 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,48 @@
1+
给定一个包含非负整数的 m x n 网格,请找出一条从左上角到右下角的路径,使得路径上的数字总和为最小。
2+
3+
说明:每次只能向下或者向右移动一步。
4+
5+
```
6+
示例:
7+
输入:
8+
[
9+
[1,3,1],
10+
[1,5,1],
11+
[4,2,1]
12+
]
13+
输出: 7
14+
解释: 因为路径 1→3→1→1→1 的总和最小。
15+
```
16+
17+
--------------
18+
### 思路:
19+
20+
和62题《不同路径》是同一个思路,都是动态规划,区别是这里是带权值的路径
21+
22+
1. 创建二维数组`path[row][column]``path[i][j] i∈[0,row-1],j∈[0,column-1]`表示到坐标`(i+1,j+1)`**最短路径和**
23+
2. 首行首列初始化;**首行**初始化是**上一行最短路径和+该位置权值**,对应公式`path[i][0] = path[i-1][0] + grid[i][0]; i∈[1,row-1],j∈[1,column-1]` 同理**首列**初始化g公式为`path[0][i] = path[0][i-1] + grid[0][i];`
24+
3. 对各点`path[i][j]`求最短路径和,坐标`(i,j)`的最短路径可以由上一行得来,或者是前一列得来,动态规划方程为:`(前一列最小路径||前一行最小路径)两者较小值+当前坐标权值`,公式为:`path[i][j] = min(path[i-1][j],path[i][j]) + grid[i][j];`
25+
26+
```CPP
27+
class Solution {
28+
public:
29+
int minPathSum(vector<vector<int>>& grid) {
30+
int row = grid.size();
31+
if(row == 0)return 0;
32+
int column = grid[0].size();
33+
34+
vector<vector<int>> path(row,vector<int>(column,0));
35+
path[0][0] = grid[0][0];
36+
for(int i = 1 ; i < column ; i++)path[0][i] = path[0][i-1] + grid[0][i];
37+
for(int i = 1 ; i < row;i++)path[i][0] = path[i-1][0]+grid[i][0];
38+
39+
for(int i = 1;i<row;i++){
40+
for(int j = 1;j<column;j++){
41+
path[i][j] = min(path[i-1][j],path[i][j-1]) + grid[i][j];
42+
}
43+
}
44+
45+
return path[row-1][column-1];
46+
}
47+
};
48+
```
Lines changed: 21 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,21 @@
1+
class Solution {
2+
public:
3+
int minPathSum(vector<vector<int>>& grid) {
4+
int row = grid.size();
5+
if(row == 0)return 0;
6+
int column = grid[0].size();
7+
8+
vector<vector<int>> path(row,vector<int>(column,0));
9+
path[0][0] = grid[0][0];
10+
for(int i = 1 ; i < column ; i++)path[0][i] = path[0][i-1] + grid[0][i];
11+
for(int i = 1 ; i < row;i++)path[i][0] = path[i-1][0]+grid[i][0];
12+
13+
for(int i = 1;i<row;i++){
14+
for(int j = 1;j<column;j++){
15+
path[i][j] = min(path[i-1][j],path[i][j-1]) + grid[i][j];
16+
}
17+
}
18+
19+
return path[row-1][column-1];
20+
}
21+
};

0 commit comments

Comments
 (0)