数据结构 day2:有序数组的平方 、长度最小的子数组、螺旋矩阵II

有序数组的平方,双指针新数组、长度最小的子数组 双指针、螺旋矩阵II

有序数组的平方,双指针新数组

Problem: 977. 有序数组的平方

思路

双指针,一个指针指向头一个指针指向尾,然后同时向中间遍历。同时平方然后比大小。依次将大的从后往前插入新的数组,即可。

解题方法

要考虑的点,多会儿停止:
最简单的方法,直接循环0~N-1也就是N次,N为nums.size()。
carl的方法,while(i <= j),他在这里讲了一下,为什么是 <=,因为i = j,这个情况是需要进行判断考虑的,所以需要加=号,如果不加=号,那么i=j这个不应该出现在这个判断循环中,换句话说就是不合法。
从二分到现在,理解了一点,遍历的这个条件,其实也就是合法条件。只要是合法的就得放进去,不合法的退出。

复杂度

  • 时间复杂度: O ( n ) O(n) O(n)

Code

class Solution {
public:
    vector<int> sortedSquares(vector<int>& nums) {
        const int N = nums.size();
        vector<int> arr(N, 0);int a = 0,b = N-1;
        for(int i = N-1;i >= 0;i--)
        {
            if((nums[a] * nums[a]) > (nums[b] * nums[b]))
            {
                arr[i] = nums[a] * nums[a];
                a++;
            }
            else
            {
                arr[i] = nums[b] * nums[b];
                b--;                
            }
        }
        return arr;
    }
};

长度最小的子数组 双指针

Problem: 209. 长度最小的子数组

思路

同样是双指针问题,但是这个又叫做滑动窗口问题。思路很好理解,也就是有一个快指针和一个慢指针,快指针时刻要保证包含的数组元素之和大于target,然后去移动慢指针,慢指针以移动,快指针就去移动到下一次元素之和大于target的地方,直到快指针移到最后一个。这里才是容易被遗忘的点:如果不进行别的操作的话,慢指针会认为快指针始终能移到满足的位置,但是快指针已经到了数组末尾了,所以这里需要追加判断,如果元素之和还成立的话,才会重新取slow和fast之间的元素个数的最小值,如果不等于那就不取了。

解题方法

一般我的解题方法均是我在写代码时的错误问题:
首先,边界问题:数组里面边界问题是一个很奇怪的问题,需要一定的总结:
如果你要放的是一个长度为N的数组,(元素个数为N)
那么实际上你的下标是0~N-1
这里就要知道for循环中,for(int i = 0;i < N;i++),它会遍历0~N-1,这个里面是不会越界的,因为当i最后++到N的时候,就不会进循环了,所以会将0~N-1的数全正常的用。
还有一个就是左闭右闭和左闭右开,需要判定这个题需不需要看这两个条件。
如果需要看的话,那么这个就是循环不变量。根据这个来判定<还是<=。

复杂度

  • 时间复杂度:

添加时间复杂度, 示例: O ( n ) O(n) O(n)

Code

class Solution {
public:
    int minSubArrayLen(int target, vector<int>& nums) {
        int slow = 0,fast = 0;
        int result = INT32_MAX;int sum = 0;
        while(slow < nums.size())
        {
         if(sum < target && fast < nums.size())
            {  
                 sum += nums[fast];
                 fast++;
                 continue;
            }
        if(sum >= target)
        {
            if((fast - slow) < result)
            {
                  result = fast - slow;
            }
        }
        sum -= nums[slow];
        slow++;
        }
        if(result == INT32_MAX) return 0;
        return result;
    }
};

螺旋矩阵II

Problem: 59. 螺旋矩阵 II

思路

螺旋矩阵已经写过好多回了,但是这回给我很大的启发。其实就是每次动的要一样,就是要右边留一个就都留一个,遵循循环不变式。

解题方法

这个题的问题,就是我在for循环里面,要int i就都int,要在while里int,for里面就别int。

Code


class Solution {
public:
    vector<vector<int>> generateMatrix(int n) {
         vector<vector<int>> array(n, vector<int>(n, 0));
         int offset = 1;
         int loop = n/2;
         int study = 0;
         int studx = 0;
         int count = 1;int mid = n / 2;
         int i = 0;int j = 0;
         while(loop--)
         {
             for(j = study;j < n-offset;j++)
             {
                 array[studx][j] = count++;
             }
             for(i = studx;i < n-offset;i++)
             {
                 array[i][n-offset] = count++;
             }
             for(;j > study;j--)
             {
                 array[n-offset][j] = count++;
             }
             for(;i > studx;i--)
             {
                 array[i][study] = count++;
             }
             offset++;
             studx++;
             study++;
         }
         if((n % 2) != 0)
         {
             array[studx][study] = count;
         }
         return array;
    }
};
class Solution {
public:
    vector<vector<int>> generateMatrix(int n) {
         vector<vector<int>> array(n, vector<int>(n, 0));
         int offset = 1;
         int loop = n/2;
         int study = 0;
         int studx = 0;
         int count = 1;int mid = n / 2;
         int i = 0;int j = 0;
         while(loop--)
         {
             for(int j = study;j < n-offset;j++)
             {
                 array[studx][j] = count++;
             }
             for(int i = studx;i < n-offset;i++)
             {
                 array[i][n-offset] = count++;
             }
             for(int j = n-offset;j > study;j--)
             {
                 array[n-offset][j] = count++;
             }
             for(int i = n-offset;i > studx;i--)
             {
                 array[i][study] = count++;
             }
             offset++;
             studx++;
             study++;
         }
         if((n % 2) != 0)
         {
             array[studx][study] = count;
         }
         return array;
    }
};
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 1
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

你牌打得好

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值