从右上角开始搜索,若当前值大于target,向左走,因为当前列的所有值都大于target
若当前值小于target,则当前行向左的所有值小于target,向下走
cpp
class Solution {
public:
bool searchMatrix(vector<vector<int>>& matrix, int target) {
int m = matrix.size() - 1, n = matrix[0].size() - 1;
int x = 0, y = n;
while (x >= 0 && x <= m && y >= 0 && y <= n)
{
if (target == matrix[x][y]) return true;
else if (target < matrix[x][y]) y -- ;
else x ++ ;
}
return false;
}
};
讲一个符合我直觉的解法:从外向内,一层层地旋转
每次完成一层中4个数的位置交换,如何得到这4个数的坐标?
每次坐标的变化,方向都是固定的:右下左上
并且每次的曼哈顿距离都是相同的
加上每次向一个方向移动k个曼哈顿距离,但是移动后的坐标"出界",此时就要向另一个方向调整
将出界的曼哈顿距离加到另一个方向上
cpp
class Solution {
public:
void rotate(vector<vector<int>>& matrix) {
int n = matrix.size(), m = matrix[0].size();
int dx[4] = { 0, 1, 0, -1 }, dy[4] = { 1, 0, -1, 0 };
int l = 0, r = m - 1, u = 0, d = n - 1;
int len = m - 1;
for (int i = 0; i < n / 2; ++ i)
{
for (int j = i; j < m - i - 1; ++ j)
{
int x = i, y = j;
int next, cur = matrix[x][y];
for (int k = 0; k < 4; ++ k)
{
int nx = x + len * dx[k], ny = y + len * dy[k];
if (ny > r)
{
nx += (ny - r);
ny = r;
}
else if (nx > d)
{
ny -= (nx - d);
nx = d;
}
else if (ny < l)
{
nx -= (l - ny);
ny = l;
}
else if (nx < u)
{
ny += (u - nx);
nx = u;
}
x = nx, y = ny;
next = matrix[nx][ny];
matrix[nx][ny] = cur;
cur = next;
}
}
l ++ , r --, u ++ , d -- ;
len -= 2;
}
}
};
// 右下左上
// j+, i+
// i+, j-
// j-, i+
// i-, j+