力扣刷题||数组的旋转189、396特定顺序遍历二维数组 54、59、

189. 轮转数组 - 力扣(LeetCode)

给定一个整数数组 nums,将数组中的元素向右轮转 k 个位置,其中 k 是非负数。

首先进了暴力法,想都不用想,超时,实在没想到可以有上面简便的方法,看了题解

题解1

采用额外数组,将原始数组中每一个元素下标加上k之后,再对数组大小取余,则将判断出会位于新数组中的上面位置,再将此新数组转换给旧数组,完成解答。

class Solution {
public:
    void rotate(vector<int>& nums, int k) {
        int n = nums.size();
        vector<int> newArr(n);
        for (int i = 0; i < n; ++i) {
            newArr[(i + k) % n] = nums[i];
        }
        nums.assign(newArr.begin(), newArr.end());
    }
};

题解2

太秒了,先将整个数组翻转,再翻转第一个到k个值,然后再翻转k到最后一个,这样就完成了翻转。

class Solution {
public:
    void reverse(vector<int>&nums,int start,int end)
    {
        while(start<end)
        {
            swap(nums[start],nums[end]);
            start++;
            end--;
        }
    }
    //数组的旋转
    //整体向右移动K个值,并且后面的值得轮到前面来
    void rotate(vector<int>& nums, int k) {
            k %=nums.size();
            reverse(nums,0,nums.size()-1);
            reverse(nums,0,k-1);
            reverse(nums,k,nums.size()-1);
    }
};

396. 旋转函数 - 力扣(LeetCode)

本题真的很秒,跟迭代能扯上关系是真的没想到。

题解真的太秒了,采用倒叙的方式,直接将F(1)到F(n-1)全部计算完毕,再取最大值。

class Solution {
public:
    int maxRotateFunction(vector<int>& nums) {
        int f = 0, n = nums.size();
        int numSum = accumulate(nums.begin(), nums.end(), 0);
        for (int i = 0; i < n; i++) {
            f += i * nums[i];
        }
        int res = f;
        //全体起立 这里真牛逼
        for (int i = n - 1; i > 0; i--) {
            f += numSum - n * nums[i];
            res = max(res, f);
        }
        return res;
    }
};

54. 螺旋矩阵 - 力扣(LeetCode)

没什么算法,纯属对数组的理解与对数组下标的理解。

class Solution {
public:
    vector<int> spiralOrder(vector<vector<int>>& matrix) {
        vector<int>result;
        if(matrix.empty())return result;
        int u=0;
        int d=matrix.size()-1;
        
        int l=0;
        int r=matrix[0].size()-1;
        while(true)
        {
            for(int i=l;i<=r;i++)
            {
                result.push_back(matrix[u][i]);
            }
            if(++u>d)break;

            for(int i=u;i<=d;i++)
            {
                result.push_back(matrix[i][r]);
            }
            if(--r<l)break;

            for(int i=r;i>=l;i--)
            {
                result.push_back(matrix[d][i]);
            }
            if(--d<u)break;

            for(int i=d;i>=u;i--)
            {
                result.push_back(matrix[i][l]);
            }
            if(++l>r)break;
        }
        return result;
    }
};

59. 螺旋矩阵 II - 力扣(LeetCode)

本题与上题类似。

class Solution {
public:
    vector<vector<int>> generateMatrix(int n) {
        vector<vector<int>>result(n,vector<int>(n));
        int u=0;
        int d=n-1;
        int l=0;
        int r=n-1;
        int cur=1;
        while(true)
        {
            for(int i=l;i<=r;i++)
            {
                result[u][i]=cur;
                if(cur>=n*n) break;
                cur++;
            }
            if(++u>d)break;

            for(int i=u;i<=d;i++)
            {
                result[i][r]=cur;
                if(cur>=n*n) break;
                cur++;
            }
            if(--r<l)break;

            for(int i=r;i>=l;i--)
            {
                result[d][i]=cur;
                if(cur>=n*n) break;
                cur++;
            }
            if(--d<u)break;

            for(int i=d;i>=u;i--)
            {
                result[i][l]=cur;
                if(cur>=n*n) break;
                cur++;
            }
            if(++l>r)break;
        }
        return result;
    }
};

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值