给你一个 m
行 n
列的矩阵 matrix
,请按照 顺时针螺旋顺序 ,返回矩阵中的所有元素。
设定每一圈的顶点值,顺时针打印。
class Solution {
public:
vector<int> spiralOrder(vector<vector<int>>& matrix) {
vector<int> res;
if(matrix.empty())
return res;
int low = 0, high = matrix.size() - 1, left = 0, right = matrix[0].size() - 1;
while(low <= high && left <= right)
{
for(int i = left; i <= right; i++)
res.push_back(matrix[low][i]);
for(int i = low + 1; i <= high; i++)
res.push_back(matrix[i][right]);
if(low < high)
{
for(int i = right - 1; i >= left; i--)
res.push_back(matrix[high][i]);
}
if(left < right)
{
for(int i = high - 1; i >= low + 1; i--)
res.push_back(matrix[i][left]);
}
left++;
right--;
low++;
high--;
}
return res;
}
};
56. 合并区间 中等
以数组 intervals 表示若干个区间的集合,其中单个区间为 intervals[i] = [starti, endi] 。请你合并所有重叠的区间,并返回一个不重叠的区间数组,该数组需恰好覆盖输入中的所有区间。
示例 1:
输入:intervals = [[1,3],[2,6],[8,10],[15,18]]
输出:[[1,6],[8,10],[15,18]]
解释:区间 [1,3] 和 [2,6] 重叠, 将它们合并为 [1,6].
示例 2:
输入:intervals = [[1,4],[4,5]]
输出:[[1,5]]
解释:区间 [1,4] 和 [4,5] 可被视为重叠区间。
class Solution {
public:
vector<vector<int>> merge(vector<vector<int>>& intervals) {
vector<vector<int>> res;
if(intervals.empty())
return res;
sort(intervals.begin(), intervals.end());
for(int i = 0; i < intervals.size(); i++)
{
int left = intervals[i][0], right = intervals[i][1];
if(res.size() == 0 || res.back()[1] < left)
res.push_back({left, right});
else
res.back()[1] = max(res.back()[1], right);
}
return res;
}
};
时间复杂度:O(nlog n),其中 n 为区间的数量。除去排序的开销,我们只需要一次线性扫描,所以主要的时间开销是排序的 O(nlogn)。
空间复杂度:O(log n),其中 n 为区间的数量。这里计算的是存储答案之外,使用的额外空间。O(logn) 即为排序所需要的空间复杂度。
给你一个 无重叠的 ,按照区间起始端点排序的区间列表。
在列表中插入一个新的区间,你需要确保列表中的区间仍然有序且不重叠(如果有必要的话,可以合并区间)。
示例 1:
输入:intervals = [[1,3],[6,9]], newInterval = [2,5]
输出:[[1,5],[6,9]]
示例 2:
输入:intervals = [[1,2],[3,5],[6,7],[8,10],[12,16]], newInterval = [4,8]
输出:[[1,2],[3,10],[12,16]]
解释:这是因为新的区间 [4,8] 与 [3,5],[6,7],[8,10] 重叠。
class Solution {
public:
vector<vector<int>> insert(vector<vector<int>>& intervals, vector<int>& newInterval) {
int left = newInterval[0], right = newInterval[1];
bool placed = false;
vector<vector<int>> res;
for(auto& i : intervals)
{
if(i[0] > right)
{
if(!placed)
{
res.push_back({left, right});
placed = true;
}
res.push_back(i);
}
else if(i[1] < left)
res.push_back(i);
else
{
left = min(left, i[0]);
right = max(right, i[1]);
}
}
if(!placed)
res.push_back({left, right});
return res;
}
};
时间复杂度:O(n),其中 n 是数组 intervals 的长度,即给定的区间个数。
空间复杂度:O(1)。除了存储返回答案的空间以外,我们只需要额外的常数空间即可。