您现在的位置是:首页 >学无止境 >代码随想录 算法小白的第二天算法之旅 977 有序数组的平方209长度最小的子数组 59 螺旋矩阵 + 数组总结网站首页学无止境
代码随想录 算法小白的第二天算法之旅 977 有序数组的平方209长度最小的子数组 59 螺旋矩阵 + 数组总结
简介代码随想录 算法小白的第二天算法之旅 977 有序数组的平方209长度最小的子数组 59 螺旋矩阵 + 数组总结
977有序数组的平方
先看题
我们先来理解题目的意思 将这个数组每个值都平方 然后 重新排序
这个时候我们疑惑的点是 平方以后我们如何重新排序
这里提供一个思路 使用双指针法 什么是 双指针 顾名思义 让两个指针分别指向这个数组的开头和结尾
为什么这样设计呢
首先我们思考一个问题 ,要给他们重新排序 ,是不是要比较他们的大小,难点就在于我们如何比较他们的大小 。
我们给这个数组开头和结尾一个指针,将开头第一个元素平方后赋给新的数组 ,新数组的长度和旧数组一样, 这样做的目的在于 方便排序 把这个数当作最大的 ,然后和旧数组最后一个元素平方比较 ,如果大 那就这个赋给新数组 如果小 就把大的赋给新数组。
下面是我写的代码 可以参考
class Solution {
public int[] sortedSquares(int[] nums) {
int[] nums2 = new int[nums.length];
int k = nums.length-1;
int i=0;
int j=nums.length-1;
while(i<=j){
if(nums[i]*nums[i] >= nums[j]*nums[j]){
nums2[k]=nums[i]*nums[i];
k--;
i++;
}else{
nums2[k]=nums[j]*nums[j];
k--;
j--;
}
}
return nums2;
}
209长度最小的子数组
题目如下
解题思路 :窗口滑动 也是双指针的变形 起始指针和终止指针都指向 数组的第一个元素 ,终止指针前移,算出终止到起始指针的元素总和 然后和目标进行对比 ,直到 比目标大 然后开始 移动 起始指针 算出起始到终止的位置
class Solution {
public int minSubArrayLen(int target, int[] nums) {
int i=0;
int subl=0;
int sum =0;
int res = Integer.MAX_VALUE;
for(int j=0;j<nums.length;j++){
sum += nums[j];
while(sum >= target){
subl=j-i+1;
res = Math.min(res ,subl);
sum =sum -nums[i];
i++;
}
}
return res == Integer.MAX_VALUE ? 0: res;
}
}
螺旋矩阵
这道题的解法稍微有些复杂 主要考虑到边界问题的分析
本质上是一道模拟题;
class Solution {
public int[][] generateMatrix(int n) {
int loop =0;
int offset =1;
int[][] res = new int[n][n];
int start =0;
int count =1;
int i ,j;
while(loop++ <(n/2)){
for( j= start; j< n-offset;j++){
res[start][j] = count++;
}
for( i =start; i<n-offset;i++){
res[i][j] = count++;
}
for( ;j>=loop;j--){
res[i][j] = count++;
}
for (;i>=loop; i--){
res[i][j] = count++;
}
start++;
offset++;
}
if(n % 2 ==1){
res[start][start] =count;
}
return res;
}
}
写这个代码的时候 需要注意一点 第二次循环的时候 坐标都变大了 也就是说 无论是第一序列(行)
还是第二序列(列) 坐标都变了 相应的 第二个内循环也需要变换 边界 也就是 -1 变成了 -2 。
风语者!平时喜欢研究各种技术,目前在从事后端开发工作,热爱生活、热爱工作。