代码随想录算法训练营第二天|leetcode 977. 有序数组的平方、209. 长度最小的子数组、59. 螺旋矩阵 II

977. 有序数组的平方

思路:

暴力法:每个数平方之后,排序

时间复杂度:

O(n + nlogn)

代码:
class Solution {
public:
    vector sortedSquares(vector& nums) {
        for(int i = 0;i

209. 长度最小的子数组

思路:

双指针法:我们可以定义两个指针slow,fast.让这两个指针都指向数组nums下标0的位置,然后定义一个count来记录我们去的fast-slow范围里的数值和,判断和target的值的大小情况。若count>=target,我们再定义一个result来收集最小的fast-slow范围里的元素个数;若count

我们继续将数组里的元素加到count里。遍历整个数组即可。

时间复杂度:

O(n)

代码:
class Solution {
public:
    int minSubArrayLen(int target, vector& nums) {
        if(nums.size()==0) return 0;
        int slow = 0;
        int fast = 0;
        int result = INT_MAX;
        int count = 0;
        count += nums[0];
        while(slow<=fast&&fast=target)
            {
                result = min(fast-slow+1,result);
                count -=nums[slow++];
                
            }
            else
            {
                if(fast

59. 螺旋矩阵 II

思路:

模拟顺时针画矩阵的过程:

  • 填充上行从左到右
  • 填充右列从上到下
  • 填充下行从右到左
  • 填充左列从下到上

由外向内一圈一圈这么画下去。

需要注意的地方:每次填入的元素个数和填完一圈后下一次需要填的元素个数,其实是由规律的。

        例如,n = 3,每次填入2个元素,下一圈填入0个元素即函数循环结束;

        n = 5,每次填入4个元素,下一圈填入2个元素,在下一圈填入0个元素即函数循环结束。

时间复杂度:

O(n^2)

代码:
class Solution {
public:
    vector> generateMatrix(int n) {
      vector>matrix(n,vector(n,0));
      int loop = n/2;
      int count = 1;
  
      int mid = n/2;
      int x = 0;
      int y = 0;
      int off = 1;
      int i,j;
      while(loop--)
      {
         i= x,j = y;
    
          for( j;jy;j--)
          {
              matrix[i][j] = count++;
              
          }
          for(i;i>x;i--)
          {
              matrix[i][j] = count++;
             
          }
          off++;
          x++;
          y++;
      } 
      if(n%2==1)
      {
          matrix[mid][mid] = count;
      }
      return matrix; 
    }
};

还有很多瑕疵,还需继续坚持!

你可能感兴趣的:(算法,leetcode,矩阵,c++)