代码随想录算法训练营14期-Day2-数组part02

代码随想录算法训练营14期-Day2-数组part02


java学习网站


977. 有序数组的平方


实现代码

1.代码

  1. 暴力排序 O(n+nlogn)
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());
        return nums;
    }
};
  1. 双指针法 O(n)
class Solution {
public:
    vector<int> sortedSquares(vector<int>& nums) {
       int left = 0,right = nums.size() - 1;
       vector<int> ans(right+1,0);
       while(left <= right){
           for(int i = right;i >= 0;i--){
               if(nums[left] * nums[left] > nums[right] * nums[right]){
                   ans[i] = nums[left] * nums[left];
                   left++;
               }
               else{
                   ans[i] = nums[right] * nums[right];
                   right--;
               }
           }
       } 
       return ans;
    }
};

2.bug

  • 排序函数sort(nums.begin(), nums.end());
  • 创建 vector ans(n);

209. 长度最小的子数组


实现代码

1.代码-滑动窗口

class Solution {
public:
    int minSubArrayLen(int target, vector<int>& nums) {
        int ans = INT_MAX;
        int i = 0,sum = 0,strlen = 0;
        for(int j = 0;j < nums.size();j++){
        //找以j为终点的长度最小
                //终点是j
                sum += nums[j];
                while(sum >= target){
                //找以i为起点,j为终点的长度最小
                    strlen = j - i + 1;
                    if(ans > strlen)
                        ans = strlen;
                    //更新起点i
                    sum = sum - nums[i];
                    i++;
                }
        }
        // return ans == INT_MAX ? 0 : ans;英文问号
        return ans == INT_MAX ? 0 : ans;
    }
};

2.bug

  • int最大值 INT_MAX;
  • sum开始移动的终点j而不是i;
  • 滑动即找到大于等于target滑动初始指针找最小长度
  • 三元运算符要用英文符号?且隔开

59. 螺旋矩阵 II


实现代码

1.代码

class Solution {
public:
    vector<vector<int>> generateMatrix(int n) {
        //定义二维数组
        vector<vector<int>> ans(n,vector<int>(n,0));
        int k = 1,x = 0,y = 0,round = 1;
        int i,j;
        int lop = n/2;
        while(lop--){
            //边界处理:左闭右开
            //从左到右
            i = x,j = y;
            for(j = y; j < n - round; j++){
                ans[i][j] = k++;
            }
            //从上到下
            for(i = x; i < n - round ;i++){
                ans[i][j] = k++;
            }
            //从右到左
            for(;j > y; j--){
                ans[i][j] = k++;
            }
            //从下到上
            for(;i > x; i--){
                ans[i][j] = k++;
            }
            //轮次加1
            round++;
            x++;
            y++;
        }
        if(n%2){
            ans[n/2][n/2] = k;
        }
        return ans;
    }
}; 

2.bug

  • 模拟到后两个循环的时候就晕了,还是要设定规则来循环
  • 需要 二刷 二维数组定义vector<vector> ans(n,vector(n,0))

总结

59题做的吃力,看评论可以再看其他人的解法。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值