力扣题目#977 有序数组的平方
注意:因为是有序的数组,可以用左右指针来比较2个数组元素的大小比较来排序
class Solution {
public int[] sortedSquares(int[] nums) {
int length = nums.length;
int[] res = new int [length];
int index = length - 1;
int left = 0;
int right = length - 1;
while (left <= right) {
int eql = nums[left] * nums[left];
int eqr = nums[right] * nums[right];
if ( eql > eqr) {
// 正数的相对位置是不变的, 调整的是负数平方后的相对位置
res[index--] = eql;
++left;
} else {
res[index--] = eqr;
--right;
}
}
return res;
}
}
力扣题目#209 长度最小的子数组
暴力解法
首先因为是连续的子数组之和,所以用两个for循环,i用来遍历整个数组,j为每一次从i位置往后遍历的子数组。毋庸置疑是Timeout
class Solution {
public int minSubArrayLen(int target, int[] nums) {
int length = nums.length;
int sum = 0; // 数组总和
int res = 0; // 结果
int subLength = 0; // 计算每次子数组长度
for (int i = 0; i < length; i++) {
sum = 0;
subLength = 0;
for (int j = i; j < length; j++) {
sum += nums[j];
subLength = j-i+1; // 因为索引是从0开始计算,所以需要加1
if (sum >= target) {
if (res == 0 || res > subLength) {
res = subLength;
}
break;
}
}
}
return res;
}
}
滑动窗口
当需要的是双指针中间的连续子数组,可以考虑使用滑动窗口
注意:循环的条件中的索引是哪个,是起始位置还是终止位置。
(这里可以假设条件是起始位置,那么终止位置遍历完子数组之后,起始条件加一,终止位置有需要遍历子数组,因此和暴力解法无区别,所以循环的条件必须是终止位置)
class Solution {
public int minSubArrayLen(int target, int[] nums) {
int length = nums.length;
int sum = 0; //计算子数组的总和
int res = length + 1;
int i = 0;
for(int j = 0; j<length; j++){
sum += nums[j];
while(sum >= target){
res = Math.min(res,j - i + 1);
sum -= nums[i];
i++;
}
}
return res == length+1 ? 0 : res;
}
}
力扣题目#59 螺旋矩阵Ⅱ
注意:矩阵问题,关键点在于矩阵的四个角的节点,利用好循环不变量原则
class Solution {
public int[][] generateMatrix(int n) {
int[][] nums = new int[n][n];
int startX = 0; //矩阵的起始位置
int startY = 0; //矩阵的起始位置
int count = 0; //排序的赋值
int end = n-1; //终止的位置
int i,j; //因为每一边都需要这些位置变量,所以是全局变量
int loop = 0; //用来判断圈数
while(n/2>loop++){
//上侧
for(j = startY; j < end; j++)
nums[startX][j] = ++count;
//右侧
for(i = startX; i < end; i++)
nums[i][j] = ++count;
//下侧
for( ; j > startY; j--)
nums[i][j] = ++count;
//左侧
for( ; i > startX; i--)
nums[i][j] = ++count;
startX ++;
startY ++;
end --;
}
if(n%2 == 1){
nums[startX][startY]= ++count;
}
return nums;
}
}
数组的总结
1、首先记得数组的下标是从零开始的,小心当做题做着做着把下标当作1开始。
2、在循环里面,换句话说,在数组的循环里面,记得坚持一个原则——循环不变量原则
3、数组中的元素是没有办法删除的,只能覆盖
4、数组中的左右指针、快慢指针、滑动窗口的使用情况