代码随想录算法训练营第二天【数组】977.有序数组的平方、209.长度最小的子数组、59.螺旋矩阵II

977.有序数组的平方
核心:双指针
心得:虽然做出来了,用到了双指针的思想,但代码过于复杂,有很多地方都可以再优化。
  1)while内的if判断,没必要拆成三个条件,直接用<=和>就可以了,while条件改为left<=right,while外面的if判断也去掉
  2)不应该从下标0开始存储,再倒排。应该直接从最后一位开始存储,存储也直接存平方
优化前:
class Solution {
    public int[] sortedSquares(int[] nums) {
        int len = nums.length;
        int left = 0;
        int right = len-1;
        int[] result = new int[len];
        int[] result2 = new int[len];
        int p = 0;
        while(left < right){
            if(nums[left]*nums[left] == nums[right]*nums[right]){
                result[p++] = nums[left++];
                result[p++] = nums[right--];
            }
            else if(nums[left]*nums[left] > nums[right]*nums[right]){
                result[p++] = nums[left++];
            }else if(nums[left]*nums[left] < nums[right]*nums[right]){
                result[p++] = nums[right--];
            }
        }
        if(left == right){
            result[p] = nums[left];
        }
        for(int i=len-1;i>=0;i--){
            result2[i] = result[len-1-i]* result[len-1-i];
        }
        return result2;
    }
}

优化后:

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

209.长度最小的子数组

核心:滑动窗口
心得:之前了解过滑动窗口,所以这道题的思路是有的,有几个细节掌握的还不好
  1)滑动窗口的右边界应该是从0一直到最右边的,所以采用for循环遍历
  2)每当sum满足条件时,为了缩短长度,需要把左边界也往右靠,所以采用while条件
  3)每次找到一个符合条件的子数组,就会计算长度,最小长度的初始值应该是数组长度+1,因为如果存在子数组,最大的长度就是数组长度。全部遍历完成后,如果没有满足条件的子数组,min就还是数组长度+1,这时返回0;如果有满足条件的子数组,min就会更新成子数的长度。
class Solution {
    public int minSubArrayLen(int target, int[] nums) {
        int sum = 0;
        int len = nums.length;
        int left = 0;
        int min = len+1;
        for(int right=0;right<len;right++){
            sum = sum+nums[right];
            while(sum>=target){
                min = Math.min(min,right-left+1);
                sum = sum-nums[left];
                left++;
            }
        }
        return min==len+1?0:min;
    }
}

59.螺旋矩阵II

心得:转圈的时候保持一致性,左闭右开
class Solution {
    public int[][] generateMatrix(int n) {
        int[][] nums  = new int[n][n];
        int start = 0;
        int loop = 0;
        int count = 1;
        int i,j;
        while(n/2 > loop++){
            for(j=start;j<n-loop;j++){
                nums[start][j] = count++;
            }
            for(i=start;i<n-loop;i++){
                nums[i][j] = count++;
            }
            for(;j>=loop;j--){
                nums[i][j] = count++;
            }
            for(;i>=loop;i--){
                nums[i][j] = count++;
            }
            start++;
        }
        if(n%2 == 1){
            nums[start][start] = count++;
        }
        return nums;
    }
}

 

posted @ 2023-02-03 01:16  橙子的房东  阅读(422)  评论(0)    收藏  举报