【无标题】

代码随想录第二天|Leetcode977.有序数组的平方,209.长度最小的子数组,59.螺旋矩阵II

Leetcode977 有序数组的平方

基本信息

题目链接:有序数组的平方
文章链接:代码随想录-有序数组的平方
完成情况:AC通过
代码:

vector<int> sortedSquares(vector<int>& nums) {
        int len = nums.size();
        vector<int> ans(len,0);
        int l = 0;
        int r = len-1;
        int k = len - 1;
        while(l <= r)
        {
            if(nums[l] * nums[l] <= nums[r] * nums[r])
            {    
                ans[k--] = nums[r] * nums[r];
                r--;
            }
            else
            {
                ans[k--] = nums[l] * nums[l];
                l++;
            }
        }
        return ans;
    }

思路介绍

数组题目首先观察数组的特点,其中偏序大小事最为重要的性质,本题中已给出非递减顺序,则要利用该性质。
若都为正数,则平方后顺序不变;
有负数情况下,则观察到两侧的数值的平方回避内侧的平方值大,如此则利用分治的思想来逐一比较两端的平方,并逐渐内移动。

Leetcode209 长度最小的数组

基本信息

题目链接:长度最小的数组
文章链接:代码随想录-长度最小的数组
完成状态:用时20min,AC通过
代码:

int minSubArrayLen(int target, vector<int>& nums) {
        int l = 0, sum = 0, sublength = 0;
        int result = INT32_MAX;
        int len = nums.size();
        for(int j = 0; j < len;j++)
        {
            sum+=nums[j];
            while(sum >= target)
            {
                sublength = j - l + 1;
                result = (result < sublength)?result:sublength;
                sum -= nums[l++];
            }
        }
        return result == INT32_MAX?0:result;
    }

思路分析

本题主要思想为滑动窗口!!
滑动窗口则是又动态规划的影子,是利用已有的局部信息,利用O(1)的花费去更新下一状态,如此节省不必要的循环花费。
具体细节:维护一个窗口,两侧可以滑动,右端移动后,左端跟上更新,充分利用已获得的信息。

Leetcode59 螺旋矩阵||

基本信息

题目链接:螺旋矩阵||
文章链接:代码随想录-螺旋矩阵||
完成情况: AC通过,花费15min
代码:

vector<vector<int>> generateMatrix(int n) {
        vector<vector<int>> res(n,vector<int>(n,0));
        int startx = 0;
        int starty = 0;
        int loop = n / 2;
        int mid = n / 2;
        int offset = n;
        int val = 1;
        while(loop--)
        {
            int i = startx;
            int j = starty;//x and y are the positionof val;
            for(i = startx; i< offset - 1; i++)  
                res[starty][i] = val++;
            for(j = starty; j < offset - 1; j++)
                res[j][i] = val++;
            for(;i>startx;i--)
                res[j][i] = val++;
            for(;j > starty; j--)
                res[j][i] = val++;
            //更新下一轮的赋值
            startx++;
            starty++;
            offset--;
        }
        if(n % 2 == 1)
            res[mid][mid] = val;
        return res;
    }

思路分析

本题没有过多地算法技巧,更注重编程习惯和意识。
在编程时要谨记不变量,全局遵守统一的规则与调度,如本题中,横向循环中是**[初始点,终止点)**,则后面每次循环都应该如此,减少混乱,而且特殊情况单独处理,n是奇数时,最中间的一个点后面单独处理,如此就方便许多。
此外,要加一些额外的状态变量来记录遍历情况。

数组总结

通过两天的习题可以发现:
数组本身是简单的数据结构,其重要考察为二分法双指针滑动窗口模拟行为
重点在于思路清晰、编程进行状态清晰,掌握二分、双指针、滑动窗口三种方法。

  • 4
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值