算法训练第二天|977.有序数组的平方 、209.长度最小的子数组、 59.螺旋矩阵II 、数组总结

977.有序数组的平方

这个题能想到有两种解法 双指针思路和暴力解法

双指针解法:

自己手写的时候能大概写出来,但运行有错,主要是边界问题,没仔细思考是否-1;但总体思路能写出来,还有一个是vector容器创建

class Solution {
public:
    vector sortedSquares(vector& nums) {
        int length=nums.size();
        vector result(length);
        int k = length-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;
    }
};

暴力解法:

不知道什么时候可以使用库函数里的排序算法,也不熟悉快速排序算法得使用方法

sort(A.bengin(),A.end());

class Solution {
public:
    vector sortedSquares(vector& nums) {
        // int length=nums.size();
        // vector result(length);
        // int k = length-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;
        //暴力解法
        for(int i = 0;i

209.长度最小的子数组

1.暴力解法:这个题暴力解法无法提交会超出时间限制 要主要外层循环一进去要把sum置为0;然后内层循环变量j从i开始 

class Solution {
public:
    int minSubArrayLen(int s, vector& nums) {
        int result = nums.size()+1;
        int k = nums.size();
        for(int i = 0;i=target){
                    k = j-i+1;
                    if (k

滑动窗口法:

        int result = nums.size()+1;
        int sublength = 0;
        int i = 0;
        int sum = 0;
        for(int j = 0;j=target){
                
                sublength = j-i+1;//取子序列长度
                result = sublength

必须使用while 不能使用if 因为要一直i++,进去while之后先取子序列长度,然后确定result

之后更新sum和i继续进入while循环

59.螺旋矩阵II 

注意定义循环圈数 每循环一次边界减小一个 最后还要注意n如果是奇数,最中心点要自己赋值

class Solution {
public:
    vector> generateMatrix(int n) {
        vector> res(n,vector(n,0));
        int loop = n/2;//循环得圈数
        int count = 1;//计数
        int sub = 1;//边界宽度
        int xindex = 0,yindex = 0;
        while(loop--){
            int i,j;
            for(i = xindex;ixindex;i--){
                res[j][i]=count++;
            }
            for(;j>yindex;j--){
                res[j][i]=count++;
            }
            xindex++;
            yindex++;
            sub++;
        }
        if(n%2==1){
            res[n/2][n/2]=n*n;
        }
        return res;

    }
};

数组总结:

1.掌握了二分查找(以后看到有序排列得数组得题目都想一下能不能用二分法做一下)

2.理解了双指针思路,可以降低复杂度,

3.滑动窗口法,

4.注意边界循环不变量得使用

5.注意vector容器得创建 一维数组和二维数组

//一维数组
vector res(n,0);
//二维数组
vector> res(m,vector(n))
vector> res(n,vector(n,0));
  • 数组下标都是从0开始的。
  • 数组内存空间的地址是连续的

你可能感兴趣的:(代码随想录一刷,算法,c++)