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

977.有序数组的平方(简单)

题目链接:977.有序数组的平方

  1. 题目描述:给你一个按 非递减顺序 排序的整数数组 nums,返回 每个数字的平方 组成的新数组,要求也按 非递减顺序 排序。
  2. 题目建议: 本题关键在于理解双指针思想

方法一:暴力解法

class Solution {
public:
    vector<int> sortedSquares(vector<int>& nums) {
        for(int i = 0; i < nums.size() ; i++){//依次算出元素平方并替换
            nums[i] *= nums[i];
        }
        sort(nums.begin(),nums.end());//快速排序
        return nums;
    }
};

方法二:双指针法

class Solution {
public:
    vector<int> sortedSquares(vector<int>& nums) {

        vector<int> result(nums.size(),0);//声明一个和原数组大小一样的结果数组,并且元素全赋为0
        int k  = nums.size() - 1;//k指向result数组的最后一个位置
        int i = 0, j = nums.size()-1;//定义头尾两个指针
        while(k >= 0){//k==0有效 因此切记别弄丢k[0] 否则例二过不了
             if(nums[i] * nums[i] > nums[j] * nums[j]){//对比两个元素平方大小,大的放入res数组中k所指的位置
            result[k--] = nums[i] * nums[i];
            i++;
        } else{
            result[k--] = nums[j] * nums[j];
            j--;
        }  
        }
       
        return result;
    }
};

这里需要注意的是k的循环条件,必须是k>=0,否则会少一次判断从而会导致用例二的不通过。如下图错误示范

209.长度最小的子数组(中等)

题目链接:
209.长度最小的子数组

  1. 题目描述:给定一个含有 n 个正整数的数组和一个正整数 target 。 找出该数组中满足其元素和 ≥ target 的长度最小的连续子数组,并返回其长度。如果不存在符合条件的子数组,返回 0 。:
  2. 题目建议:着重理解滑动窗口

方法一:暴力解法

class Solution {
public:
    int minSubArrayLen(int s, vector<int>& nums) {
        int reslut = INT32_MAX;
        int sublength;   //子数组的长度
        int sum;         //子数组元素之和
        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 >= s){//一旦子序列之和超过s,则取子序列的长度并更新reslut
                sublength = j - i + 1; //取子序列的长度
                reslut = reslut < sublength ? reslut : sublength;//其实就是不断取满足条件的更短子序列长度
                 break;
                }
            }
        }
        //若result的值没有改变,则返回0,说明没有符合条件的子序列
        return reslut == INT32_MAX ? 0 :reslut;
    }
};

注:INT32_MAX:是个很大的数,如果想得到数组中最小值,可以先将min1(下方代码中的一个变量)设成INX_MAX,这样就不需要const int定义一个很大的数了,还有很多地方都可以使用它。
INT_MAX和INT_MIN
方法二:滑动窗口
暴力解法中,第一个for循环滑动窗口的起始位置,第二个for循环滑动窗口的终止位置,使用了两个for循环完成了一个不断搜索区间的过程。而滑动窗口则是只使用一个for循环来完成工作。
思路:寻找子序列势必需要考虑窗口的起始和终止位置,那么滑动窗口法所使用的的一个for循环是用于表示窗口起始位置还是终止位置呢,若表示起始位置,那么遍历剩下的终止位置成为了一个棘手的问题;故考虑将其用于表示窗口的终止位置。
!!!着重理解while循环中sum - = nums[i++];

class Solution {
public:
    int minSubArrayLen(int s, vector<int>& nums) {
        int reslut = INT32_MAX; //求最小值,故先假定结果为一个很大的数
        int sublength = 0;      //滑动窗口的长度
        int sum= 0;             //滑动窗口的元素之和
        int i = 0;              //滑动窗口的起始位置
            for(int j = 0; j < nums.size(); j++){//子序列终止位置为j
                sum += nums[j];
                while(sum >= s){//使用while,每次更新i位置,并且不断比较子序列是否一旦子序列符合条件,取子序列的长度并更新reslut
                sublength = j - i + 1; //取子序列的长度
                reslut = reslut < sublength ? reslut : sublength;//其实就是不断取满足条件的更短子序列长度
                sum -= nums[i++];//不断变更i(滑动窗口的起始位置),先减去当前i处元素再往后移动
                }
            }
        
        //若result的值没有改变,则返回0,说明没有符合条件的子序列
        return reslut == INT32_MAX ? 0 :reslut;
    }
};

59. 螺旋矩阵 II(中等)

题目链接:螺旋矩阵 II

  1. 题目描述:给你一个正整数 n ,生成一个包含 1 到 n^2 所有元素,且元素按顺时针顺序螺旋排列的 n x n 正方形矩阵 matrix 。
  2. 题目建议:
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值