训练营0922|数组系列

本文探讨了如何使用双指针技巧高效地解决有序数组平方问题,以及通过实例展示了如何应用双指针方法找到长度最小的子数组。通过实例代码和策略理解了如何在有序数组中合并平方值并保持数组顺序,同时涉及到了滑动窗口的概念在其他问题中的应用。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

977.有序数组的平方

 

 看见题目的第一反应就是暴力解法,挨个平方之后排序

class Solution {
    /**
     * 非递减顺序排列的数组中将每个数平方后排序
     * @param nums
     * @return
     */
    public int[] sortedSquares(int[] nums) {
        for (int i = 0; i < nums.length; i++) {
            nums[i]*=nums[i];
        }
        Arrays.sort(nums);
        return nums;
    }
}

但如果说要用双指针我就很懵,双指针?slow和fast的话两者是什么意义?想了一下还是没想通最后索性去看讲解了 有序数组平方讲解

 如果一个数组有序,[-4,-2,3,5]包含负数的话,平方之后最大数的出现肯定是原始数组两端的数,然后两指针逐渐往中间缩。

当然这还有一个前提就是,不去合并平方后的值相同的情况。当然就算要合并,也变成移除数组相同元素的题了。

class Solution {
    /**
     * 双指针方法,left和right比较,谁大谁先放在新数组后面
     * @param nums
     * @return
     */
    public int[] sortedSquares(int[] nums) {
       int[] arr=new int[nums.length];
       int left=0,right= nums.length-1;
        for (int i = arr.length-1; i >=0 ; i--) {
            int templeft=nums[left]*nums[left];
            int tempright=nums[right]*nums[right];
            arr[i]=templeft>tempright?nums[left]*nums[left++]:nums[right]*nums[right--];
        }
        return arr;
    }
}

left和right比较,谁大谁先放在新数组后面,然后该指针往中间移动

209.长度最小的子数组

利用双指针缩窗口里面的值看是否满足条件(本题中是和值>=target)

right指针一直外扩,扩到符合条件的时候去缩left指针

class Solution {
    /**
     * 滑动数组--长度最小的子数组
     * @param target
     * @param nums
     * @return
     */
    public int minSubArrayLen(int target, int[] nums) {
        int left=0,right=0;//滑动数组的边界
        int ans=Integer.MAX_VALUE;
        int sum=0;
        for (int i = 0; i < nums.length; i++) {
            sum+=nums[i];
        }
        //处理极端情况,数组里面所有值加起来还比target小
        if(sum<target){
            return 0;
        }
        sum=0;
        while (right< nums.length){
            sum+=nums[right];
            while (sum>=target){
                ans=ans<(right-left+1)?ans:(right-left+1);
                sum-=nums[left];
                left++;
            }
            right++;
        }

        return ans;
    }
}

59.螺旋矩阵II

一开始是没有思路的,包括去听了讲解,在coding方面之后还要多轮几次

class Solution {
    /**
     * 顺时针填入数(坚持左闭右开)明确区间
     * @param n
     * @return
     */
    public int[][] generateMatrix(int n) {
        int [][]ans=new int[n][n];
        int number=1;//填入的数据
        int loop=1;//转圈
        int startx=0,starty=0;
        int i=0,j=0;
        while(loop<=n/2){
            for( j=starty;j<n-loop;j++){
                ans[startx][j]=number++;
            }
            for (i = startx; i <n-loop ; i++) {
                ans[i][j]=number++;
            }
            for(j=n-loop;j>startx;j--){
                ans[i][j]=number++;
            }
            for (i =n-loop; i >starty; i--) {
                ans[i][j]=number++;
            }
            loop++;
            startx++;
            starty++;//缩圈
        }
        if(n%2!=0){
            ans[n/2][n/2]=number;
        }
        return ans;
    }
}

 感觉在写的时候还是对照一下绕的表,可能会把各种变量的含义搞的更清楚。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值