有序数组的平方和螺旋矩阵II

  有序数组的平方

题干

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

示例 1:

输入:nums = [-4,-1,0,3,10]

输出:[0,1,9,16,100]

解释:平方后,数组变为 [16,1,0,9,100]

排序后,数组变为 [0,1,9,16,100]

示例 2:

输入:nums = [-7,-3,2,3,11]

输出:[4,9,9,49,121]

如果把里面的内容全部都变成平方后再排序的话,现在在leetcode已经过不去了,所以还是要找个时间复杂度更小的算法,比如说双指针~。

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

    private int square(int num) {
        return num * num;
    }
}

在上述算法中定义两个指针,因为对于结果的排序有影响的,也就是负数的存在,不过也可以这么去想,最大的平方数会出现在数组的两端,所以可以考虑使用双指针,不过要注意的点就是这个while循环的判断条件,是left <= right 这个的话主要还是怕有遗漏,因为循环内是if-else操作,到最后可能会出现有数组内元素没有被处理。

  螺旋矩阵II

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

示例 1:

输入:n = 3

输出:[[1,2,3],[8,9,4],[7,6,5]]

示例 2:

输入:n = 1

输出:[[1]]

这道题的话,就是模拟,没有任何其它的算法,不过自己在初次见到这个题目的时候会因为边界问题而抓狂,所以为了使代码更加简单,要关注一个东西:循环不变量,这个也就是说在循环的时候我们不需要去关注循环内的内容,也就是不管循环次数loop怎么样,内部的代码处理逻辑是相同的。

class Solution {
    public int[][] generateMatrix(int n) {
        int[][] res = new int[n][n];
        int count = 1;
        int loop = 0;
        int i = 0;
        int j = 0;
        int start = 0;
        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 != 0) {
            res[n / 2][n / 2] = count;
        }

        return res;
    }
}

注意的是上述的代码,i与j是给定的,是在循环中不断迭代的数值

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值