【代码随想录】DAY 2(有序数组的平方、长度最小的子数组、螺旋矩阵)

第一题 

力扣

【代码随想录】DAY 2(有序数组的平方、长度最小的子数组、螺旋矩阵)_第1张图片

第一道AC的题,开心

class Solution {
public:
    vector sortedSquares(vector& nums) {
        for(auto iter=nums.begin();iter!=nums.end();iter++)
        {
            *iter= (*iter) * (*iter); 
        }
        sort(nums.begin(),nums.end());
        return nums;
    }
};

 学习记录:

双指针法,数组有序,可以比较从前寻和从后寻的平方大小。

class Solution {
public:
    vector sortedSquares(vector& nums) 
    {
        vector result(nums.size());
        int i=0;
        int j=nums.size()-1;
        int k=result.size()-1;
        while( i <= j )
        {
            if ((nums[i]*nums[i]) > (nums[j]*nums[j]))
            {
                result[k]=nums[i]*nums[i];
                k--;
                i++;
            }
            else
            {
                result[k]=nums[j]*nums[j];
                k--;
                j--;
            }
        }
        return result;
    }
};

 第二题

力扣

【代码随想录】DAY 2(有序数组的平方、长度最小的子数组、螺旋矩阵)_第2张图片

第二题好难啊不会,一开始以为是求最少元素的和大于等于target,但是一直过不了才发现是连续子数组。。。。后来想用双指针做的,暂时解不出来,后面仔细想想

int minSubArrayLen(int target, vector& nums) {
    sort(nums.begin(), nums.end());
    int sum = 0;
    int result = 1;
    for (auto iter = nums.rbegin(); iter != nums.rend(); iter++)
    {
        sum = (*iter) + sum;
        cout << "n=" << *iter << ",sum=" << sum << endl;
        if (sum >= target)
        {
            return result;
        }
        result++;
    }
    return 0;
}
class Solution {
public:
    int minSubArrayLen(int target, vector& nums) {
    int sum=0;
    int result=1;
    int max=nums.front();
    auto flag=nums.begin();
    for(auto iter=nums.begin();iter!=nums.end();iter++)
    {
        if (*iter> max)
        { 
            max=*iter;
            flag=iter;
        }
    }
    if(max >= target)
    {return 1;}
    
};

 学习记录:

滑动窗口:类似于双指针,窗口长度就是满足数组元素和大于目标值的子数组长度,当判断到当前的子数组和大于目标值以后,起始指针i就要往右边挪一个,然后再判断。

INT32_MAX是一个宏常量,定义在头文件中,表示int类型的最大可能值。

class Solution {
public:
    int minSubArrayLen(int target, vector& nums) 
    {
        int sum=0;
        int i=0;
        int j=0;
        int length=0;
        int min_length=INT32_MAX;//宏常量,表示int类型的最大可能值
        for(int j=0;j= target)
            {
                length = j + 1 -i;//现在满足条件的子序列长度
                sum = sum-nums[i];//起始指针往右挪
                i++;
                min_length = min_length > length ? length : min_length; 
            }

        }   
            
        return  min_length == INT32_MAX ? 0 : min_length;

    }
};

第三题 

力扣

【代码随想录】DAY 2(有序数组的平方、长度最小的子数组、螺旋矩阵)_第3张图片

想了好久,可算做出来了,一个一个填的,思路如下

class Solution {
public:
    vector> generateMatrix(int n) 
    {
        vector> Matrix(n,vector(n,0)); 
        int k=0;
        int last=0;
        for(int k=0; k<=n-1-k; k++)
        {
            for(int j=k; jk; j--)//下
            {
                Matrix[n-1-k][j] = ++last;
            }
            for(int i=n-1-k; i>k; i--)//左
            {
                Matrix[i][k] = ++last;
            }
            if (n%2 != 0)
            {
                Matrix[n/2][n/2]=n*n;
            }
        }
        return Matrix;
    }
};

学习记录:

螺旋矩阵,顺时针填充,固定边界条件左闭右开,不要写乱。

随想录代码:

class Solution {
public:
    vector> generateMatrix(int n) {
        vector> res(n, vector(n, 0)); // 使用vector定义一个二维数组
        int startx = 0, starty = 0; // 定义每循环一个圈的起始位置
        int loop = n / 2; // 每个圈循环几次,例如n为奇数3,那么loop = 1 只是循环一圈,矩阵中间的值需要单独处理
        int mid = n / 2; // 矩阵中间的位置,例如:n为3, 中间的位置就是(1,1),n为5,中间位置为(2, 2)
        int count = 1; // 用来给矩阵中每一个空格赋值
        int offset = 1; // 需要控制每一条边遍历的长度,每次循环右边界收缩一位
        int i,j;
        while (loop --) {
            i = startx;
            j = starty;

            // 下面开始的四个for就是模拟转了一圈
            // 模拟填充上行从左到右(左闭右开)
            for (j = starty; j < n - offset; j++) {
                res[startx][j] = count++;
            }
            // 模拟填充右列从上到下(左闭右开)
            for (i = startx; i < n - offset; i++) {
                res[i][j] = count++;
            }
            // 模拟填充下行从右到左(左闭右开)
            for (; j > starty; j--) {
                res[i][j] = count++;
            }
            // 模拟填充左列从下到上(左闭右开)
            for (; i > startx; i--) {
                res[i][j] = count++;
            }

            // 第二圈开始的时候,起始位置要各自加1, 例如:第一圈起始位置是(0, 0),第二圈起始位置是(1, 1)
            startx++;
            starty++;

            // offset 控制每一圈里每一条边遍历的长度
            offset += 1;
        }

        // 如果n为奇数的话,需要单独给矩阵最中间的位置赋值
        if (n % 2) {
            res[mid][mid] = count;
        }
        return res;
    }
};

你可能感兴趣的:(算法,leetcode,数据结构)