cpp刷题打卡记录30——轮转数组 & 螺旋矩阵 & 搜索二维矩阵II

轮转数组

法一:

cpp 复制代码
class Solution {
public:
    void rotate(vector<int>& nums, int k) {
        int n = nums.size();
        while(k>0){
            vector<int> nums1 = nums;
            int tmp = nums1[n-1];
            for(int i = 1; i<n; i++){
                nums[i] = nums1[i-1];
            }
            nums[0] = tmp;
            k--;
        }
    }
};

超出时间限制。总体思想很简单,就是每次循环时把变化前的数组记录下来,然后第一个元素是最后一个元素,其余都是把前一个元素赋值给当前元素。

法二:

cpp 复制代码
class Solution {
public:
    void rotate(vector<int>& nums, int k) {
        int n = nums.size();
        k = k % n;
        if(k == 0){
            return;
        }
        reverse(nums.begin(), nums.end());
        reverse(nums.begin(), nums.begin()+k);
        reverse(nums.begin()+k, nums.end());
    }
};

想法就是利用reverse,如nums = 1,2,3,4,5,6,7,k=3;那么先翻转整个数组7,6,5,4,3,2,1,再翻转前k个5,6,7,4,3,2,1,再翻转后面的5,6,7,1,2,3,4,得到最终结果。但需要注意的是可能 k 会大于数组的大小,k如果等于数组的大小,那就最终会刚好翻转一遍和原数组相同,所以当k大于数组大小,就没有必要翻转那么多次,所以有k = k%n的步骤。

螺旋矩阵

cpp 复制代码
class Solution {
public:
    vector<int> spiralOrder(vector<vector<int>>& matrix) {
        int m = matrix.size();
        int n = matrix[0].size();
        vector<int> result(n*m, 0);
        int count = 0;
        int n1 = min(m, n)/2;
        int i = 0, j = 0, startx = 0, starty = 0;
        int offset = 1;
        while(n1){
            i = startx;
            j = starty;
            for(j ; j<n-offset; j++){
                result[count] = matrix[i][j];
                count++;
            }
            for(i; i<m-offset; i++){
                result[count] = matrix[i][j];
                count++;
            }
            for(j; j>=offset; j--){
                result[count] = matrix[i][j];
                count++;
            }
            for(i; i>=offset; i--){
                result[count] = matrix[i][j];
                count++;
            }
            startx++;
            starty++;
            offset++;
            n1--;
        }
        if(min(n, m)%2 == 1){
            if(m <= n){
                for(j=starty; j<=n-offset; j++){
                    result[count] = matrix[startx][j];
                    count++;
                }
            }
            else{
                for(i=startx; i<=m-offset; i++){
                    result[count] = matrix[i][starty];
                    count++;
                }
            }
        }
        return result;
    }
};

思路是一圈一圈的输出,最后最中间那块再单独处理输出一下。需要注意的是一圈一圈的输出是要按照相同的规律去输出的,如上代码就是左闭右开去输出的,然后每次都从(0, 0),(1, 1)这样的位置开始进行输出。最后最中间需要单独处理的也分两种情况,分为竖着的一列和横着的一行,然后进行赋值输出。定义count变量是方便可以 进行赋值,不然要用push_back,可能会影响时间。

搜索二维矩阵II

cpp 复制代码
class Solution {
public:
    bool searchMatrix(vector<vector<int>>& matrix, int target) {
        int m = matrix.size();
        int n = matrix[0].size();
        int i = 0;
        int j = n-1;
        while(i<m && j>=0){
            if(target == matrix[i][j]){
                return true;
            }
            else if(target < matrix[i][j]){
                j--;
            }
            else{
                i++;
            }
        }
        return false;
    }
};

思路是从右上角开始,当target>matrixij时,就往下进行移动去寻找,当target<matrixij时,就往左进行移动去寻找;如果是从左上角开始的话,那么往下和往右都是逐渐变大的。

相关推荐
地平线开发者2 小时前
profiler debug 工具用法与高一致性策略
算法·自动驾驶
编程大师哥2 小时前
匿名函数 lambda + 高阶函数
java·python·算法
我叫袁小陌2 小时前
算法解题思路指南
算法
MC皮蛋侠客3 小时前
C++17 多线程系列(五):C++17 并行算法——从串行到并行的零成本迁移
c++·多线程
地平线开发者3 小时前
Conv+BN+Add+ReLU 融合机制简介
算法·自动驾驶
也曾看到过繁星3 小时前
数据结构---顺序表
数据结构
yuanyuan2o23 小时前
模型预训练:Hugging Face Transformers 基础
算法·ai·语言模型·自然语言处理·nlp·深度优先
杨充3 小时前
1.3 浮点型数据设计灵魂
开发语言·python·算法
妄想出头的工业炼药师3 小时前
GS slam mono
算法·开源