Leetcode59(代码随想录:螺旋矩阵Ⅱ)
循环不变量很重要!左闭右开区间 [ , )
最多转 n/2 圈的原因是,每转一圈上下左右都会减一,也就是说上下减2、左右减2,那么最多转 n/2 圈。
C++代码:
一、vector对象: vector<int> nums;
1. 求vector数组长度:nums.size();
2. 在数组尾部插入元素elem:nums.push_back(elem);
3. 删除数组尾部最后一个元素:nums.pop_back();
4. 删除位置pos的元素:nums.erase(const pos);
5. 删除位置begin到end之间的元素:nums.erase(const begin, const end);
6. 创建vector数组:
(1)一维:vector<int> result(nums.size(), 0);初始化元素值为0,元素个数为nums.size()的一维数组;
(2)二维:vector<vector<int>> result(row, vector<int>(column, 0));初始化row*column的二维数组,初始化值为0;
7. 数组第一个元素:nums.begin();
8. 数组最后一个元素:nums.end();
9. 使用sort对数组进行排序需要包含头文件#include<algorithm>:
(1)对数组升序排序:sort(nums.begin(), nums.end());
(2)对数组降序排序:sort(nums.begin(), nums.end(), greater<int>());
10. std::cout不能直接输出整个vector数组,需要对vector数组遍历依次输出;
二、知识:
1. INT32_MAX:需要#include<limits.h>,是一个宏定义,数值等于2147483647;
class Solution {
public:
vector<vector<int>> generateMatrix(int n) {
int i, j = 0;
int xstart = 0; //x轴起始位置
int ystart = 0; //y轴起始位置
int offset = 1; //终止位置
int count = 1;
vector<vector<int>> result(n, vector<int>(n, 0));
for(int t = 0; t < n/2; t++)
{
//左闭右开区间,不处理每条边的终点
for(j = ystart; j < n-offset; j++)
{
result[xstart][j] = count++;
}
for(i = xstart; i < n-offset; i++)
result[i][j] = count++;
for(j; j > ystart; j--)
result[i][j] = count++;
for(i; i > xstart; i--)
result[i][j] = count++;
xstart++;
ystart++;
offset++;
}
if(n%2 != 0)
result[n/2][n/2] = count;
return result;
}
};
Python代码:
1. python求数组nums长度:
len(nums)
2. python取整:
middle = (left + right) // 2
3. python移除数组nums中的元素val:
nums.remove(val)
4.(1)python升序排序,列表本身修改:
nums.sort()
(2)python升序排序,返回新列表:
sorted(nums)
5.(1)列表地址相同:result = nums
(2)创建列表副本:result = nums[:]
6.(1)float('inf'):正无穷大
(2)float('-inf'):负无穷大
7. 建立二维列表的方法:result = [[0] * n for _ in range(n)]
class Solution:
def generateMatrix(self, n: int) -> List[List[int]]:
result = [[0] * n for _ in range(n)]
xstart, ystart = 0, 0
mid, loop = n // 2, n//2
count = 1
for offset in range(1, loop + 1):
for j in range(ystart, n-offset):
result[xstart][j] = count
count += 1
for i in range(xstart, n-offset):
result[i][j+1] = count
count += 1
for j in range(n-offset, ystart, -1):
result[i+1][j] = count
count += 1
for i in range(n-offset, xstart, -1):
result[i][j-1] = count
count += 1
xstart += 1
ystart += 1
if n%2 != 0:
result[mid][mid] = count
return result
Leetcode59(代码随想录:螺旋矩阵Ⅰ)
C++代码:
class Solution {
public:
vector<int> spiralOrder(vector<vector<int>>& matrix) {
int m = matrix.size();
int n = matrix[0].size();
int i, j;
int xstart = 0;
int ystart = 0;
int offset = 1;
vector<int> result;
int k = m<n ? m:n;
int loop = k/2;
while(loop--)
{
for(j = ystart; j < n-offset; j++)
result.push_back(matrix[xstart][j]);
for(i = xstart; i < m-offset; i++)
result.push_back(matrix[i][j]);
for(;j > ystart; j--)
result.push_back(matrix[i][j]);
for(;i > xstart; i--)
result.push_back(matrix[i][j]);
xstart++;
ystart++;
offset++;
}
if(k % 2 != 0)
{
if(k < n)
{
for(int h = k/2; h <= n-offset; h++)
result.push_back(matrix[k/2][h]);
}
else
{
for(int h = k/2; h <= m-offset; h++)
result.push_back(matrix[h][k/2]);
}
}
return result;
}
};
Python代码:
class Solution:
def spiralOrder(self, matrix: List[List[int]]) -> List[int]:
xstart, ystart = 0, 0
m = len(matrix)
n = len(matrix[0])
k = m if m < n else n
loop = k//2
result = []
for offset in range(1, loop+1):
for j in range(ystart, n-offset):
result.append(matrix[xstart][j])
for i in range(xstart, m-offset):
result.append(matrix[i][j+1])
for j in range(n-offset, ystart, -1):
result.append(matrix[i+1][j])
for i in range(m-offset, xstart, -1):
result.append(matrix[i][j-1])
xstart += 1
ystart += 1
if k%2 != 0:
if k < n:
for h in range(loop, n-loop):
result.append(matrix[loop][h])
else:
for h in range(loop, m-loop):
result.append(matrix[h][loop])
return result