训练营第二天,今天的题相对昨天会更有难度一些,今天也暴露了我基本功不足的问题,希望继续努力可以弥补一些。
977 有序数组的平方
题解及想法
方法一,暴力破解法
直接遍历一遍,在原有数值上进行平方,如何进行排序
class Solution {
public int[] sortedSquares(int[] nums) {
for(int i = 0; i < nums.length; i++){
nums[i] = nums[i] * nums[i];
}
Arrays.sort(nums);
return nums;
}
}
方法二
通过双指针进行操作,一个指向开始,一个指向结尾,因为原数组是 非递减顺序 排序的,所以克根据两个指针指向的数组的平方进行比较,大的就存到新数组中,然后数值中数值大的指针向中间走一步,继续比较
class Solution {
public int[] sortedSquares(int[] nums) {
int l = 0;
int r = nums.length - 1;
int t = nums.length - 1; //作为新数组的指针
int[] a = new int[nums.length];
while (l <= r){
if(nums[l] * nums[l] <= nums[r] * nums[r]){
a[t--] = nums[r] * nums[r];
r--;
}else{
a[t--] = nums[l] * nums[l];
l++;
}
}
return a;
}
}
209 长度最小的子数组
题解及想法
本题采用的是滑动窗口的思想,首先明确窗口内是大于等于target
的范围,在这个范围内进行滑动,注意for循环指的是窗口的终止位置,通过while不断调整起始位置
class Solution {
public int minSubArrayLen(int target, int[] nums) {
int start = 0;
int sum = 0;
int result = Integer.MAX_VALUE;
for(int end = 0; end < nums.length; end++){
sum += nums[end];
while(sum >= target){
result = Math.min(result,end - start + 1);
sum -= nums[start];
start++;
}
}
if(result == Integer.MAX_VALUE){
return 0;
}
return result;
}
}
59 螺旋矩阵II
题解及想法
本题主要是考察循环边界的理解,本题中我们循环每一条边都遵循左闭右开的思想,就可以保证每一条边都是同一个范围
首先明确while的循环次数,也就是n/2次,然后明确从左到右、从上到下、从右到左、从下到上的边界,也就是从这一条边的开头到结尾的前一个,保证左闭右开,依次进行循环。特别要注意,如果n为奇数,需要额外补上中间的值。
class Solution {
public int[][] generateMatrix(int n) {
int x = 0, y = 0; //每循环一圈的起始位置
int offset = 1; //矩阵行和列边界值的控制变量
int num = 1;
int[][] result = new int[n][n];
int i,j;
int loop = 0;
while( loop++ < n / 2 ){
for(j = y; j < n - offset; j++){ //上
result[x][j] = num++;
}
for(i = x; i < n - offset; i++){ //右
result[i][j] = num++;
}
for(; j > y; j--){ //下 j已经到达最下
result[i][j] = num++;
}
for(; i > x; i--){ //左
result[i][j] = num++;
}
offset++;
x++;
y++;
}
if(n % 2 == 1){
result[x][y] = num;
}
return result;
}
}