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>matrix[i][j]时,就往下进行移动去寻找,当target<matrix[i][j]时,就往左进行移动去寻找;如果是从左上角开始的话,那么往下和往右都是逐渐变大的。

相关推荐
南境十里·墨染春水2 小时前
C++ 笔记 thread
java·开发语言·c++·笔记·学习
南境十里·墨染春水2 小时前
C++ 笔记 高级线程同步原语与线程池实现
java·开发语言·c++·笔记·学习
瞎折腾啥啊2 小时前
CMake FetchContent与ExternalProject
c++·cmake·cmakelists
三品吉他手会点灯3 小时前
STM32 VSCode 开发-C/C++的环境配置中,找不到C/C++: Edit Configurations选项
c语言·c++·vscode·stm32·单片机·嵌入式硬件·编辑器
逻辑驱动的ken3 小时前
Java高频面试考点场景题09
java·开发语言·数据库·算法·oracle·哈希算法·散列表
帅小伙―苏3 小时前
力扣42接雨水
前端·算法·leetcode
AI科技星3 小时前
精细结构常数α的几何本源:从第一性原理的求导证明、量纲分析与全域验证
算法·机器学习·数学建模·数据挖掘·量子计算
6Hzlia4 小时前
【Hot 100 刷题计划】 LeetCode 287. 寻找重复数 | C++ 数组判环 (快慢指针终极解法)
c++·算法·leetcode
MegaDataFlowers4 小时前
26.删除有序数组中的重复项
算法