每日两题 / 240. 搜索二维矩阵 II && 48. 旋转图像 - 力扣(LeetCode热题100)

240. 搜索二维矩阵 II - 力扣(LeetCode)

从右上角开始搜索,若当前值大于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;
    }
};

48. 旋转图像 - 力扣(LeetCode)

讲一个符合我直觉的解法:从外向内,一层层地旋转

每次完成一层中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+
相关推荐
Fanxt_Ja2 天前
【LeetCode】算法详解#15 ---环形链表II
数据结构·算法·leetcode·链表
元亓亓亓3 天前
LeetCode热题100--105. 从前序与中序遍历序列构造二叉树--中等
算法·leetcode·职场和发展
淘小白_TXB21963 天前
头条号矩阵运营经验访谈记录
线性代数·矩阵
仙俊红3 天前
LeetCode每日一题,20250914
算法·leetcode·职场和发展
_不会dp不改名_3 天前
leetcode_21 合并两个有序链表
算法·leetcode·链表
吃着火锅x唱着歌3 天前
LeetCode 3302.字典序最小的合法序列
leetcode
睡不醒的kun3 天前
leetcode算法刷题的第三十四天
数据结构·c++·算法·leetcode·职场和发展·贪心算法·动态规划
吃着火锅x唱着歌3 天前
LeetCode 978.最长湍流子数组
数据结构·算法·leetcode
爱编程的化学家3 天前
代码随想录算法训练营第十一天--二叉树2 || 226.翻转二叉树 / 101.对称二叉树 / 104.二叉树的最大深度 / 111.二叉树的最小深度
数据结构·c++·算法·leetcode·二叉树·代码随想录
吃着火锅x唱着歌3 天前
LeetCode 1446.连续字符
算法·leetcode·职场和发展