DAY2|LeetCode977.有序数组的平方 ,209.长度最小的子数组 ,59.螺旋矩阵II

977.有序数组的平方

看到这个题目,首先想到的是先把数组里的数字挨个平方再排序完事,第一时间写出的代码如下:

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

我傻了,用的冒泡排序,超出时间限制了,其实一个sort排序函数就完事了,把冒泡排序换成

sort(nums.begin(), nums.end());

改了以后,就通过了,没有超出时间限制,但显然不是最优解。因为最初的数组也是按照顺序排列的,因为平方之后大小顺序才发生改变,所以可以考虑采用双指针法:

class Solution {
public:
    vector<int> sortedSquares(vector<int>& nums) {
        int n = nums.size();
        vector<int> result(n, 0);
        int i = 0,j = n-1,k = n-1;
        while(i <= j) //注意,这里要i <= j,因为最后要处理两个元素。我开始写的是i!=j,会报错。
        {
            if(nums[i] * nums[i] < nums[j] * nums[j])
            {
                result[k--] = nums[j] * nums[j];
                j--;
            }
            else
            {
                result[k--] = nums[i] * nums[i];
                i++;
            }
        }
        return result;
    }
};

注意:while里的条件不能写i!=j,这里要i <= j,因为最后要处理两个元素!!!

209.长度最小的子数组

这道题首先我考虑的是用快慢指针解决,具体思路如下:指定一个快慢指针指向数组起点,count值为累计的总值,当总值小于target,快指针向右移动,同时设定一个值计算count里包含到了几个数组值。当count值等于大于target时,slow指针向右挪动,直到count重新小于target。fast指针继续向右边移动,重复以上规律直到到达数组尾部。想法很丰满,实现起来bug一堆> _ <,菜果然是原罪,不过我还是艰难的尝试了,代码如下:

class Solution {
public:
    int minSubArrayLen(int s, vector<int>& nums) {
        int result = INT32_MAX;
        int count = 0; 
        int slow = 0; 
        int subLength = 0; 
        for (int fast = 0; fast < nums.size(); fast++) {
            count += nums[fast];
            while (count >= s) {
                subLength = (fast - slow + 1); 
                result = result < subLength ? result : subLength;
               count -= nums[slow++]; 
            }
        }
        return result == INT32_MAX ? 0 : result;
    }
};

59.螺旋矩阵II

这是一道中等题,题目的描述看起来很简单,但是实操起来被各种边界条件弄得模模糊糊,看了视频解说之后,自己写了一遍:

class Solution {
public:
    vector<vector<int>> generateMatrix(int n) {
        vector<vector<int>> res(n,vector(n,0));
        int num = 1; //要填入数组的数字
        int loop = n/2;//循环的次数
        int startx = 0,starty = 0;//起始的位置
        int mid = n/2;//矩阵中间的位置
        int offset = 1;//每次循环以后圈子在缩小,需要设置一个值来收缩范围
        int i,j;
        while(loop --)
        {   
            i = startx;
            j = starty;
            for(j = starty; j < n - offset; j++)
            {
                res[startx][j] = num++;
            }
            for(i = startx;i < n - offset; i++)
            {
                res[i][j] = num++;
            }
            for(; j > starty; j--)
            {
                res[i][j] = num++;
            }
            for(; i > startx; i--)
            {
                res[i][j] = num++;
            }
            startx++;
            starty++;
            offset++;    
        } 
          if (n % 2) 
        {
            res[mid][mid] = num;
        }   
        return res;
    }
};

做的磕磕绊绊,感觉需要再重复做几遍~

今天的三道题打卡完毕!~撒花~

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值