有序数组的平方
题干
给你一个按 非递减顺序 排序的整数数组 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 ,生成一个包含 1 到 n2 所有元素,且元素按顺时针顺序螺旋排列的 n x n 正方形矩阵 matrix 。
示例 1:
![](https://i-blog.csdnimg.cn/blog_migrate/feffd09bca2e6a6a144153ebd1aa461a.jpeg)
输入: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是给定的,是在循环中不断迭代的数值