补打卡day02
977.有序数组的平方
思路:
双指针法,一个指针指向原数组的首,一个指针指向原数组的尾部,
再新建一个等长的数组用来保存结果,从后往前保存。
通过比较原数组元素前后两端平方数的大小,来决定是否放入新数组。
代码:
class Solution {
public int[] sortedSquares(int[] nums) {
int[] results = new int[nums.length];
int left = 0;
int right = nums.length - 1;
for(int k = nums.length -1 ; k>=0; k--){
if(nums[left]*nums[left] < nums[right]*nums[right]){
results[k] = nums[right]*nums[right];
right--;
}else{
results[k] = nums[left]*nums[left];
left++;
}
}
return results;
}
}
209.长度最小的子数组
思路
为了返回最小长度,先定义一个结果变量,用于接收最小长度值。找到sum>=target的最小长度子数组,可以使用双指针,控制窗口的大小,记录满足条件的长度,如果比之前的更小就放到结果中。
代码
第一次有错的代码:
class Solution {
public int minSubArrayLen(int target, int[] nums) {
int len = nums.length + 1;
int slow = 0;
int fast = 0;
int sum = 0;
while(fast < nums.length){
sum = sum + nums[fast];
if(sum >= target){
if((fast - slow + 1)<len){
len = fast - slow + 1;
}
sum = sum - nums[slow];
slow++;
}
fast++;
}
if(len == nums.length+1){
return 0;
}else{
return len;
}
}
}
问题分析:
整个代码出错是因为sum>=target的判断应该用循环!!!
直到没有更小的值了再继续!
正确的代码:
class Solution {
public int minSubArrayLen(int target, int[] nums) {
int len = nums.length + 1;
int slow = 0;
int fast = 0;
int sum = 0;
while(fast < nums.length){
sum = sum + nums[fast];
while(sum >= target){
if((fast - slow + 1)<len){
len = fast - slow + 1;
}
sum = sum - nums[slow];
slow++;
}
fast++;
}
if(len == nums.length+1){
return 0;
}else{
return len;
}
}
}
59.螺旋矩阵II
思路
初始思路:矩阵有二维的坐标,所以定义这两维的指针来控制矩阵每个元素的位置。
看完题解:同时注意定义好区间,我这里是左闭右开!!用一个指针控制圈数,再用一个指针控制每次的起始位置。本题目不涉及算法,而是模拟过程,考验对代码的掌控能力。
代码
class Solution {
public int[][] generateMatrix(int n) {
int i;
int j;
int start = 0;
int mat[][] = new int[n][n];
int k = 1;
int loop = 0;
while(loop++ < n/2){
i = start;
j = start;
for(;j<n - loop;j++){
mat[i][j] = k++;
}
for(;i<n - loop;i++){
mat[i][j] = k++;
}
for(;j>start;j--){
mat[i][j] = k++;
}
for(;i>start;i--){
mat[i][j] = k++;
}
start++;
}
if(n % 2 == 1){
mat[start][start] = k;
}
return mat;
}
}