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

相关推荐
此生决int16 分钟前
快速复习之数据结构篇——二叉树(三)
数据结构
djarmy17 分钟前
C 标准库 `<stdio.h>` 完整函数清单(官方标准 + 常用全部函数)
c语言·c++·算法
code_whiter21 分钟前
C++10(list)
c++·windows·list
七牛云行业应用22 分钟前
NotebookLM 手机版上线了,这份完整指南帮你把它用起来
算法
城事漫游Molly26 分钟前
定量研究设计清单:问卷、实验与变量操作化怎么做?
大数据·人工智能·算法·ai写作·论文笔记
Epiphany.55628 分钟前
带依赖关系的最短路问题
算法
2301_8152795239 分钟前
实战分享实现 C++ 管理类单例模式:特点与最佳实践
javascript·c++·单例模式
洛水水43 分钟前
【力扣100题】22. 矩阵置零
算法·leetcode·矩阵
Liangwei Lin43 分钟前
LeetCode 78. 子集
数据结构·算法·leetcode
多加点辣也没关系1 小时前
数据结构与算法|第二十四章:算法思维总结与实战
算法·代理模式