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

977.有序数组的平方

给你一个按非递减顺序 排序的整数数组 ,返回每个数字的平方组成的新数组,要求也按非递减顺序排序。

class Solution {
public:
    vector sortedSquares(vector& nums) {
        //排序法
        vector result(nums.size(),0);//直接定义vector result;会出现问题
        for(int i=0;i result(nums.size(),0);
        int left=0;
        int right=nums.size()-1;
        for(int i=nums.size()-1;i>=0;i--) {
            if(left>right) break;
            if((nums[left]*nums[left])>=(nums[right]*nums[right])) {
                result[i]=nums[left]*nums[left];
                left++;
            }
            else if(nums[left]*nums[left] result(nums.size(),0);
        int k=nums.size()-1;
        for(int i=0,j=nums.size()-1;i<=j;) {
            if(nums[i]*nums[i]>=nums[j]*nums[j]) {
                result[k--]=nums[i]*nums[i];
                i++;
            }
            else {
                result[k--]=nums[j]*nums[j];
                j--;
            }
        }
        return result;
    }
};

209.长度最小的子数组

给定一个含有 个正整数的数组和一个正整数 找出该数组中满足其和的长度最小的连续子数组,并返回其长度如果不存在符合条件的子数组,返回0。(连续的子数组的和大于等于目标值,求包含元素个数最小的子数组)

class Solution {
public:
    int minSubArrayLen(int target, vector& nums) {
       //暴力法(超时)
       int sum=0;
        int k=0;
        int result=INT32_MAX;;
        for(int i=0;i=target) {
                   result=result< k ?result: k; 
                   break; 
                } 
            }         
        }
        //return result == INT32_MAX ? 0 : result;
        if(result==INT32_MAX) return 0;
        else return result;
        
        //滑动窗口(for循环中放的是终止位置的指针)
        int result=INT32_MAX;
        int k=0;
        int sum=0;
        int j=0;//滑动窗口起始位置
        for(int i=0;i=target) {
                result=k

59.螺旋矩阵

给你一个正整数 ,生成一个包含n到n2所有元素,且元素按顺时针顺序螺旋排列的正方形矩阵。

class Solution {
public:
    vector> generateMatrix(int n) {
        vector> result(n,vector(n,0));
        int startx=0;
        int starty=0;
        int mid=n/2;
        int loop=n/2;
        int count=1;
        int offset=1;
        while(loop--) {
            int i=startx;
            int j=starty;
            for(j=starty;jstarty;j--) {
                result[i][j]=count++;
            }
            for(;i>startx;i--) {
                result[i][j]=count++;
            }
            startx++;
            starty++;
            offset+=1;
        }
        if(n%2) {
            result[mid][mid]=count;
        }
        return result; 
    }
};
  •  数组

数组下标都是从0开始的。

数组内存空间的地址是连续的。

数组元素不能删除,只能覆盖。

在定义数组时,要给出大小及内容。例:vector result(n,0); 代表定义一个包含n个0的数组result。

  • 双指针法

双指针法(快慢指针法):通过一个快慢指针在一个for循环下完成两个for循环的工作。

  • 滑动窗口

相比于暴力法降低时间复杂度。

例209题,通过一个for循环完成滑动窗口,for循环中的变量为窗口结束位置,当和大于目标值后将滑动窗口起始位置向后移动,可通过一个for循环控制滑动窗口

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