代码随想录算法 - Day2 数组Part2

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

给你一个按 非递减顺序 排序的整数数组 nums,返回 每个数字的平方 组成的新数组,要求也按 非递减顺序 排序。


解题思路:看到这道题目的第一想法是有两种做法:一是将数组中的每个元素平方,得到新的心得数组,然后再重新排序,另一种是先将数组中的元素按绝对值排完序,再进行平方操作。

class Solution {
    public int[] sortedSquares(int[] nums) {
        int left = 0;
        int right = nums.length -1;
        int[] result = new int[nums.length];
        int n = nums.length - 1;
        while(left <= right) {
            if(nums[left] * nums[left] > nums[right] * nums[right]) {
                result[n--] = nums[left] * nums[left++];
            } else {
                result[n--] = nums[right] * nums[right--];
            }
        }
        return result;
    }
}

易错点:第一次result[] 定义时长度取的nums.length-1导致下标越界

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

给定一个含有 n 个正整数的数组和一个正整数 target 。

找出该数组中满足其总和大于等于 target 的长度最小的 连续子数组 [numsl, numsl+1, ..., numsr-1, numsr] ,并返回其长度如果不存在符合条件的子数组,返回 0 

解题思路:看到这道题目的第一感觉没那么简单,连续子数组,就可以从数组第一个元素遍历,直到找到一个大于target的子数组然后统计长度,接着从第二个元素重复上面的操作,比较找到的数组的长度,直到找到长度最小的数组,然后返回长度。看了视频后发现滑块窗口真香哈哈

class Solution {
    public int minSubArrayLen(int s, int[] nums) {
        int left = 0;
        int sum = 0;
        // 不符合情况会返回0
        int result = Integer.MAX_VALUE;
        for (int right = 0; right < nums.length; right++) {
            sum += nums[right];
            while (sum >= s) {
                result = Math.min(result, right - left + 1);
                sum -= nums[left++];
            }
        }
        return result == Integer.MAX_VALUE ? 0 : result;
    }
}

易错点:没想到未符合条件如何返回,结果发现给给默认值即可

题目链接:59.螺旋矩阵II

给你一个正整数 n ,生成一个包含 1 到 n2 所有元素,且元素按顺时针顺序螺旋排列的 n x n 正方形矩阵 matrix 。

解题思路:其实考察的还是区间,边界条件。认准[left,right),loop=n/2,因为循环一次,高度减少2,直到等于0,循环了n/2次。i和j的初始值要注意赋值。

class Solution {
    public int[][] generateMatrix(int n) {
        int startX =0;
        int startY =0;
        int loop = n/2;
        int offset = 1;
        int count = 1;
        int[][] result = new int[n][n];
        while(loop-->0) {
            int i =startX;
            int j=startY;
            // 从左往右
            // [left,right),right = n-offset,
            for (j = startY; j < n - offset; j++) {
                result[i][j] = count++;
            }
            // 从上往下
            for(i = startX;i<n-offset;i++){
                result[i][j] = count++;
            }
            // 从右往左
            for(;j>=offset;j--){
                result[i][j] = count++;
            }
            // 从下往上
            for(;i>=offset;i--){
                result[i][j] = count++;
            }

            startX++;
            startY++;
            offset++;
        }
        if(n%2!=0){
            result[n/2][n/2] = n*n;
        }
        return result;
    }
}

螺旋矩阵还是有点没完全整明白,需要再捣鼓捣鼓

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值