977.有序数组的平方
给你一个按 非递减顺序 排序的整数数组
nums
,返回 每个数字的平方 组成的新数组,要求也按 非递减顺序 排序。
本题转换下思路,可以转化为两个数组(正数部分和负数部分)的归并问题,有了这个思路整体就比较简单了。首先准备两个指针,分别指向负数部分末尾和正数部位起始位置,然后从两个方向开始归并,下面看代码
class Solution {
public int[] sortedSquares(int[] nums) {
int index1 = 0;
while (index1< nums.length && nums[index1] < 0) index1 ++;
int index2 = nums.length - 1;
while (index2 > -1 && nums[index2] >= 0) index2 --;
int[] nums2 = new int[nums.length];
for (int i = 0; index1 < nums.length || index2 > -1 ; i++) {
if(index2 == -1){
nums2[i] = nums[index1] * nums[index1];
index1 ++;
}
else if(index1 == nums2.length){
nums2[i] = nums[index2] * nums[index2];
index2--;
}
else {
if(-nums[index2] <= nums[index1]){
nums2[i] = nums[index2] * nums[index2];
index2--;
}else {
nums2[i] = nums[index1] * nums[index1];
index1 ++;
}
}
}
return nums2;
}
}
27. 移除元素
给定一个含有
n
个正整数的数组和一个正整数target
。找出该数组中满足其和
≥ target
的长度最小的 连续子数组[numsl, numsl+1, ..., numsr-1, numsr]
,并返回其长度。如果不存在符合条件的子数组,返回0
。
本题是滑动数组的典型题目,滑动数组也是双指针的一种,通过slowIndex和fastIndex指针标记出符合题目条件的子数组部分。一般fastIndex负责扫描收集数组,slowIndex负责根据筛选条件将不符合条件的数组成员排除。在本题中,fastIndex向后扫描,双指针中包含的数字和大于等于target,并同时将slowIndex也向数组尾部移动(移动时保证和大于taget)。
class Solution {
public int minSubArrayLen(int target, int[] nums) {
int startIndex = 0;
int sum = 0;
int min = Integer.MAX_VALUE;
for (int endIndex = 0; endIndex < nums.length; endIndex++) {
sum += nums[endIndex];
while (sum >= target){
min = Math.min(min,endIndex - startIndex + 1);
sum -= nums[startIndex++];
}
}
if (min == Integer.MAX_VALUE) min = 0;
return min;
}
}
59.螺旋矩阵II
给你一个正整数
n
,生成一个包含1
到n2
所有元素,且元素按顺时针顺序螺旋排列的n x n
正方形矩阵matrix
。
如下图:
看图分析,无法简单通过两次循环打印出所需矩阵,两层打印只能做到按行或列输出。看图分析,容易看出来,螺旋矩阵实际是按“层”遍历的,一圈即为一层,每层有四个不同的状态,其中每层的“末尾”需要特殊处理,根据分析,我们不难写出代码
class Solution {
public int[][] generateMatrix(int n) {
int [][] result = new int[n][n];
int count = n - 1;
int mark = 2; //由上图容易看出,数组其实是从2开始打印的
int x = 0; //横坐标
int y = 0; //纵坐标
int temp ; //标记是否到每层的末尾
int reset = 1; //末尾的值需要特殊处理
for (int i = count; i > 0 ; i-=2) {
temp = i * 4; //计数
for (int j = 0; j < 4; j++) {
//四个值对应x,y的四种变化
for (int k = 0; k < i; k++) {
temp --;
if(temp == 0){
result[x-1][y] = reset;
reset = mark++;
break;
}
if(j == 0) y++;
if(j == 1) x++;
if(j == 2) y--;
if(j == 3) x--;
result [x][y] = mark++;
}
}
y++;
}
//n为奇数需要特殊处理
if(n % 2 != 0){
result [n/2][n/2] = n*n;
}
return result;
}
}