代码随想录第二天,本人第四天

学习内容

  • 有序数组的平方
    • 我的代码:
class Solution {
    public int[] sortedSquares(int[] nums) {
        int n = nums.length;
        int i = 0;
        int k = n - 1;//直接倒着记录
        int j = n - 1;
        int[] res = new int[n];

        while(i <= j) {
            if(nums[i]*nums[i] >= nums[j]*nums[j]) {
                res[k] = nums[i]*nums[i];
                i++;
                //k++;
            } else {
                res[k] = nums[j]*nums[j];
                j--;
                //k++;
            }
            k--;
            if(k == -1) {
                break;
            }
        }
        return res;
    }
}
  • 长度最小的子数组
    • 核心思想:
      • 滑动窗口:滑动窗口本质就是一种同向的双指针,结合题目的含义,用左右/快慢指针来维持一个窗口
    • 经典题目:
      • 最小覆盖字串
      • 无重复字符的最长字串
      • 水果成篮
    • 本题的代码:
class Solution {
    public int minSubArrayLen(int target, int[] nums) {
        int n = nums.length;
        int i = 0;
        int j = 0;
        int sum = 0;
        int L = n + 1;

        for(i = 0; i < n; i++) {
            if(sum < target) {
                sum += nums[i];
            }
            while(sum >= target) {
                L = Math.min(i - j + 1, L);
                sum -= nums[j];
                j++;
            }  
        }
        return L == n + 1 ? 0 : L;
    }
    
}
  • 螺旋二维数组
    • 本质就是模拟
    • 代码
class Solution {
    public int[][] generateMatrix(int n) {
        int[][] arr = new int[n][n];

        int r = n - 1;
        int l = 0;
        int b = n - 1;
        int t = 0;

        int m = n * n;
        int i = 0;

        while(m-- > 0) {
            for(int j = l; j < r; j++) {
                arr[t][j] = ++i;
            }

            for(int j = t; j < b; j++) {
                arr[j][r] = ++i;
            }

            for(int j = r; j > l; j--) {
                arr[b][j] = ++i;
            }

            for(int j = b; j > t; j--) {
                arr[j][l] = ++i;
            }
            r--;
            l++;
            b--;
            t++;
        }
        if(n % 2 == 1) {
            arr[n/2][n/2] = n*n;
        }

        return arr;
    }
}
  • 存在问题:
    • 不够熟练
  • 本题相关题目的注意点
    • 注意边界,
    • 力扣54题是本题的逆过程。尤其需要注意边界
      • 力扣54题代码
class Solution {
    public List<Integer> spiralOrder(int[][] matrix) {
        List<Integer> res = new ArrayList<>();
        int m = matrix.length;
        int n = matrix[0].length;
        int r = n - 1;
        int l = 0;
        int t = 0;
        int b = m - 1;
        int count = m * n;

        while(l < r && t < b){
            if(l < r) {
                for(int i = l; i < r; i++) {
                    res.add(matrix[t][i]);
                    count--;
                }
            }
            if(t < b) {
                for(int i = t; i < b; i++) {
                    res.add(matrix[i][r]);
                    count--;
                }
            }
            if(l < r) {
                for(int i = r; i > l; i--) {
                    res.add(matrix[b][i]);
                    count--;
                }
            }

            if(t < b) {
                for(int i = b; i > t; i--) {
                    res.add(matrix[i][l]);
                    count--;
                }
            }

            b--;
            r--;
            l++;
            t++;
        }
        ------打印test数组可以用来检测最后的停落点-----
        List<Integer> test = new ArrayList<>();
        test.add(b);
        test.add(r);
        test.add(l);
        test.add(t);
		--------------------------------------------
        if(b == t) {
            for(int i = l; i <= r; i++) {
                res.add(matrix[b][i]);
            }
        } else if(r == l) {
            for(int i = t; i <= b; i++) {
                res.add(matrix[i][r]);
            }
        }

        return res;
    }
}
  • 7
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值