代码随想录算法训练营Day2 | 数组part02

题目链接:LeetCode977:有序数组的平方

        思路:这道题目在于加深双指针法的理解,双指针可以是“快慢”指针从一头开始遍历,也可以是分别从两头开始遍历;这个题目是有序数组,那么可以将双指针分别定在数组的首尾,首尾元素取平方后比较将较大值放入新数组尾端,同时移动原数组中指针的位置;

class Solution {
    public int[] sortedSquares(int[] nums) {
        int left = 0;
        int right = nums.length - 1;
        int ans = nums.length - 1;
        // 定义一个新的数组大小与原数组一样
        int[] result = new int[nums.length];

        while(left <= right) {
            // 比较首尾指针对应元素的平方值,并移动指针位置
            if(nums[right] * nums[right] >= nums[left] * nums[left]) {
                result[ans] = nums[right] * nums[right];
                right --;
            } else {
                result[ans] = nums[left] * nums[left];
                left ++;
            }
            ans --;
        }
        return result;
    }
}
题目链接:LeetCode209:长度最小的子数组

        思路:这道题目在于滑动窗口方法的掌握,在给定的数组中获取元素和大于等于目标值的最小子数组;定义两个指针left、right,先移动right指针,计算其累加值与target比较,当累加值大于等于target时,固定right指针位置,移动left,并在累加值中减去left走过的元素,直到累加值符合小于目标值条件;重复上述移动,直到right指针到达数组尾部,在移动过程中,每当符合类加值大于等于target时,记录(right-left+1)大小;

class Solution {
    public int minSubArrayLen(int target, int[] nums) {
        
        int left = 0;
        int sum = 0;
        int res = Integer.MAX_VALUE;

        for(int right = 0; right < nums.length; right ++) {
            sum += nums[right];
            while(sum >= target) {
                res = Math.min(res, right - left + 1);
                sum -= nums[left++];
            }
        }
        return res == Integer.MAX_VALUE ? 0 : res;
    }
}
题目链接:LeetCode59:螺旋数组 II

        思路:这个题目只要固定好起点和终止调节,从左到右,从上到下,绕圈打印即可;

class Solution {
    public int[][] generateMatrix(int n) {
        int loop = 0;
        int[][] res = new int[n][n];
        int start = 0;
        int count = 1;
        int i, j;

        while(loop++ <n/2) {
            for(j=start;j<n-loop;j++){
                res[start][j]=count++;
            }
            for(i=start;i<n-loop;i++){
                res[i][j]=count++;
            }
            for(;j>=loop;j--){
                res[i][j]=count++;
            }
            for(;i>=loop;i--){
                res[i][j]=count++;
            }
            start++;
        }
        if(n%2 == 1){
            res[start][start] = count;
        }

        return res;

    }
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值