LeetCode Learn C++ || Day 2 977.有序数组的平方 ,209.长度最小的子数组 ,59.螺旋矩阵II

写在前面:

        慎独慎初慎微慎欲,自重自省自警自励。

 

977.答题过程

首先尝试暴力排序解法:

最直观的想法,莫过于:每个数平方之后,排个序。

class Solution {
public:
    vector<int> sortedSquares(vector<int>& nums) {
        for(int i=0;i<nums.size();i++){
            nums[i]=nums[i]*nums[i];
        }
    sort(nums.begin(),nums.end());//注意这里sort括号里面的格式
    return nums;//不能直接return sort... 需要return nums;
    }
};

其中sort的用法学习:(37条消息) C++ sort函数用法_无火的残烬的博客-CSDN博客_c++sort函数用法

双指针排序: 


class Solution {
public:
    vector<int> sortedSquares(vector<int>& nums) {
        vector<int> result(nums.size(), 0);//创建一个新的数组用来存放排序后的数,注意格式,result是名称,可以随便取
        int k = nums.size() - 1;
        for (int i = 0, j = nums.size() - 1; i <= j;) { // 注意这里要i <= j,因为最后当i=j时候,也要平方传到新数组里,注意这里for循环的用法(第二个分号后面)
            if(nums[i]*nums[i]>nums[j]*nums[j]){
                result[k] = nums[i] * nums[i];
                i++;
            }
            else {//这里包含了=的情况
                result[k] = nums[j] * nums[j];
                j--;
            }
            k--;//这里k--可以移到for循环里面第二个分号后面,但是看着容易乱
        }
        return result;

    }
};

 

 206.答题过程

暴力解法:

class Solution {
public:
    int minSubArrayLen(int target, vector<int>& nums) {
        int result = INT32_MAX; // 最终的结果  INT32_MAX是一个很大的值
        int sum = 0; // 子序列的数值之和
        int subLength = 0; // 子序列的长度
        for (int i = 0; i < nums.size(); i++) { // 设置子序列起点为i
            sum = 0;//需要注意这一行。
            for (int j = i; j < nums.size(); j++) { // 设置子序列终止位置为j
                sum += nums[j];
                if (sum >= target) { // 一旦发现子序列和超过了;target,更新result
                    subLength = j - i + 1; // 取子序列的长度
                    result = result < subLength ? result : subLength;//三目运算符
                    break; // 因为我们是找符合条件最短的子序列,所以一旦符合条件就break,注意:这个break只是第二个for循环结束了
                }
            }
        }
        // 如果result没有被赋值的话,就返回0,说明没有符合条件的子序列
        return result == INT32_MAX ? 0 : result;
    }
};

 

滑动窗口(双指针):

相当于用一个for循环,实现两个for循环的功能

class Solution {
public:
    int minSubArrayLen(int target, vector<int>& nums) {
        int result=INT32_MAX;
        int sum=0; // 滑动窗口数值之和
        int length=0;   // 滑动窗口长度
        int i=0;  //滑动窗口初始值
        for(int j=0;j<nums.size();j++){//j是滑动窗口的终止位置
            sum=sum+nums[j];
            // 注意这里使用while,每次更新 i(起始位置),并不断比较子序列是否符合条件
            while(sum>=target){
            length=j-i+1;// 取子序列的长度
            result=result<length?result:length; //result=min(length,result);这样写也可以
            sum=sum-nums[i];  //这里改成num[i++],下面的i++删去也可以,需注意i++是先拿i去运算,再加1
            i++;    // 这里体现出滑动窗口的精髓之处,不断变更i(子序列的起始位置)  注意这里i++要放在sum运算的下面,不能放在上面。          
            }
        }
     // 如果result没有被赋值的话,就返回0,说明没有符合条件的子序列
    return result==INT32_MAX?0:result;
    }
};

 

59.答题过程 

c++使用vector创建二维数组的方法:

//使用vector一次性完成二维数组的定义(注意:此种方法适用于每一行的列数相等的二维数组)

vector<vector<int>> matrix(m, vector<int>(n, -1));

//以下是拆分理解

//创建一维数组matirx,这个数组里有m个元素,元素是int型vector。

vector<vector<int>> matrix(m);//matrix是二维数组名称

//除了定义数组类型及数组大小外,同时给数组中的元素赋值:将元素赋值为大小为n的int型vector。

vector<vector<int>> matrix(m, vector<int>(n));//这里创建的是m行,n列的二维数组

//除了定义数组类型、数组大小、列的大小,同时给数组列中的元素(或者说,数组中的所有元素)赋值为-1。

vector<vector<int>> matrix(m, vector<int>(n, -1));

class Solution {
public:
    vector<vector<int>> generateMatrix(int n) {
        vector<vector<int>> res(n,vector<int>(n,0));// 使用vector定义一个二维数组,注意左行右列
        int startx=0;  //二维数组的行数
        int starty=0;  //二维数组的列数  定义每循环一个圈的起始位置
        int loop=n/2;  //每个圈循环几次,例如n为奇数3,那么loop = 1 只是循环一圈,矩阵中间的值需要单独处理
        int number=1; //初始化元素为1,用来给矩阵中每一个空格赋值
        int offset=1; //设置的左闭右开,所以初始让边界减去的值为1
        int i,j;
        while(loop--){  
            i=startx;
            j=starty;
        for(j=starty;j<n-offset;j++){//注意,n是从1开始,但是j的位置是从0开始 这是第一个边界的赋值  这里还需要注意一个点,前面已经int了j,在此处的for循环中不能再int j 了,比如for(int j=starty;j<n-offset;j++) 就是错的
            res[startx][j]=number;
            number++;
        }
        for(i=startx;i<n-offset;i++){//这是第二个边界,第一个丨边界赋值
            res[i][j]=number;
            number++;
        }
        for(;j>starty;j--){
            res[i][j]=number;
            number++;
        }
        for(;i>startx;i--){
            res[i][j]=number;
            number++;
        }
        // 第二圈开始的时候,起始位置要各自加1, 例如:第一圈起始位置是(0, 0),第二圈起始位置是(1, 1)
        startx++;//进入到下一层的螺旋里,这些边界的初始值都要加一,包括边界减去的值setoff
        starty++;
        offset++;
    }
    if(n%2==1){//当n是奇数的时候,需要单独给矩阵最中间的位置赋值
        res[n/2][n/2]=number;
    }
    return res;
    }
};

 

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值