leetcode——54.螺旋矩阵

该博客介绍了两种不同的算法实现方式,用于遍历二维矩阵并按照螺旋顺序输出元素。第一种方法通过定义四个方向的移动方向,动态调整路径;第二种方法则是按层循环,逐层遍历矩阵。这两种方法均能有效解决给定问题,适用于处理包含螺旋遍历需求的矩阵操作。

思路1:

  1. 沿右下左上一次访问矩阵(四个方向)
  2. 设立一个visit数组用于记录访问过的元素
  3. 访问路径为矩阵元素的总数则停止访问
  4. 对矩阵size为0进行特殊处理,因为后续对order进行内存申请,并不申请为size为0的order

代码1:

class Solution {
private:
    //右 下 左 上
    static constexpr int directions[4][2] = {{0, 1}, {1, 0}, {0, -1}, {-1, 0}};
public:
    vector<int> spiralOrder(vector<vector<int>>& matrix) {
        if (matrix.size() == 0 || matrix[0].size() == 0)
            return {};
        //数据初始化
        int rows = matrix.size(), columns = matrix[0].size();
        vector<vector<bool>> visited(rows, vector<bool>(columns));
        int total = rows * columns;
        vector<int> order(total);
		//开始访问
        int row = 0, column = 0;
        int directionIndex = 0;
        for (int i = 0; i < total; i++) {
        	//访问当前元素
            order[i] = matrix[row][column];
            visited[row][column] = true;
            //计算下一个元素位置
            int nextRow = row + directions[directionIndex][0];
            int nextColumn = column + directions[directionIndex][1];
            //判断是否出界或访问过,是的话转弯
            if (nextRow < 0 || nextRow >= rows || nextColumn < 0 || nextColumn >= columns || visited[nextRow][nextColumn]) 
                directionIndex = (directionIndex + 1) % 4;
            //获取合法的下一个元素位置
            row += directions[directionIndex][0];
            column += directions[directionIndex][1];
        }
        return order;
    }
};

思路2:

  1. 对矩阵按层循环,每层都走右下左上
  2. 需要注意循环条件的约束,还有左上方向的约束
  3. 每个for的每个方向都得到达指针位置,即都有“=”,除了没有

代码2:

class Solution {
public:
    vector<int> spiralOrder(vector<vector<int>>& matrix) {
        //特殊处理
        if (matrix.size() == 0 || matrix[0].size() == 0) 
            return {};
        //数组初始化
        int rows = matrix.size(), columns = matrix[0].size();
        vector<int> order;
        int left = 0, right = columns - 1, top = 0, bottom = rows - 1;
        //开始访问
        while (left <= right && top <= bottom) {//这里的等于是为了访问单行/单列的元素
            //向右
            for (int column = left; column <= right; column++) 
                order.push_back(matrix[top][column]);
            //向下
            for (int row = top + 1; row <= bottom; row++) 
                order.push_back(matrix[row][right]);
            if (left < right && top < bottom) {//这里没有等于是因为要转弯
                //向左
                for (int column = right - 1; column >= left; column--)
                    order.push_back(matrix[bottom][column]);
                //向上
                for (int row = bottom-1; row > top; row--) 
                    order.push_back(matrix[row][left]);
            }
            //转更内层
            left++;
            right--;
            top++;
            bottom--;
        }
        return order;
    }
};
先看效果: https://renmaiwang.cn/s/jkhfz Hue系列产品将具备高度的个性化定制能力,并且借助内置红、蓝、绿三原色LED的灯泡,能够混合生成1600万种不同色彩的灯光。 整个操作流程完全由安装于iPhone上的应用程序进行管理。 这一创新举措为智能照明控制领域带来了新的启示,国内相关领域的从业者也积极投身于相关研究。 鉴于Hue产品采用WiFi无线连接方式,而国内WiFi网络尚未全面覆盖,本研究选择应用更为普及的蓝牙技术,通过手机蓝牙与单片机进行数据交互,进而产生可调节占空比的PWM信号,以此来控制LED驱动电路,实现LED的调光功能以及DIY调色方案。 本文重点阐述了一种基于手机蓝牙通信的LED灯设计方案,该方案受到飞利浦Hue智能灯泡的启发,但考虑到国内WiFi网络的覆盖限制,故而选用更为通用的蓝牙技术。 以下为相关技术细节的详尽介绍:1. **智能照明控制系统**:智能照明控制系统允许用户借助手机应用程序实现远程控制照明设备,提供个性化的调光及色彩调整功能。 飞利浦Hue作为行业领先者,通过红、蓝、绿三原色LED的混合,能够呈现1600万种颜色,实现了全面的定制化体验。 2. **蓝牙通信技术**:蓝牙技术是一种低成本、短距离的无线传输方案,工作于2.4GHz ISM频段,具备即插即用和强抗干扰能力。 蓝牙协议栈由硬件层和软件层构成,提供通用访问Profile、服务发现应用Profile以及串口Profiles等丰富功能,确保不同设备间的良好互操作性。 3. **脉冲宽度调制调光**:脉冲宽度调制(PWM)是一种高效能的调光方式,通过调节脉冲宽度来控制LED的亮度。 当PWM频率超过200Hz时,人眼无法察觉明显的闪烁现象。 占空比指的...
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值