文章目录
- Leecode977.有序数组的平方
- 题目链接
- 题目
- 暴力解法
- 双指针解法
- 小结
- Leecode209.长度最小的子数组。
- 题目连接
- 题目
- 难点 :
- 滑动窗口
- Leecode59.螺旋矩阵II
- 题目链接
- 题目
- 思路
- 用到的变量
- 代码
- 总结
- 今日收获
Leecode977.有序数组的平方
题目链接
题目
给你一个按 非递减顺序 排序的整数数组 nums,返回 每个数字的平方 组成的新数组,要求也按 非递减顺序 排序。
示例 1: 输入:nums = [-4,-1,0,3,10] 输出:[0,1,9,16,100] 解释:平方后,数组变为
[16,1,0,9,100],排序后,数组变为 [0,1,9,16,100]示例 2: 输入:nums = [-7,-3,2,3,11] 输出:[4,9,9,49,121]
暴力解法
public int[] sortedSquere1(int []nums)
{
if(nums ==null|| nums.length==0){
return nums;
} //排除不合适的条件
for(int i=0;i< nums.length;i++)
{
nums[i]=nums[i]*nums[i];
} //用一个for循环 将每一个元素都乘一遍
Arrays.sort(nums); //最后用Arrays.sort() 排序走起
return nums;
}
双指针解法
数组其实是有序的,两边的值平方之后都可能成为最大数
那么可以说,最大值要么在左,要么在右边,不可能在中间
此时就可以考虑使用双指针,left 指向起始位置 right指向终点位置
- 如果A[left] * A[left] < A[right] * A[right] 那么result[k–] = A[right] * A[right]; 。
- 如果A[left] * A[left] >= A[right] * A[right] 那么result[k–] = A[left] * A[left]; 。
int right =nums.length-1 ;//右指针 减一是下标
int left =0;
int result[] = new int[ nums.length]; //原来数有多长就放多少
int index = nums.length-1; //是要放到新数组里面的 下标
while(left<=right) //考虑到 中间值 画图
{
if
( result[left]* result[left] >nums[right]*nums[right] )
{
result[index--]= result[left]*result[left];
++left; // 为什么要先+
}
else
{
result[index++]= result[right]*result[right];
--right;
}
}
return result;
}
小结
这里没太大难度,除了自己看 ++left 和++right 与自己平常用法不同之外 也就没了,后来问到是可以表达同一个意思的
都是 变量+1
Leecode209.长度最小的子数组。
题目连接
题目
给定一个含有 n 个正整数的数组和一个正整数 s ,找出该数组中满足其和 ≥ s 的长度最小的 连续
子数组,并返回其长度。如果不存在符合条件的子数组,返回 0。示例:
输入:s = 7, nums = [2,3,1,2,4,3] 输出:2 解释:子数组 [4,3] 是该条件下的长度最小的子数组。
难点 :
滑动窗口
所谓滑动窗口,就是不断的调节子序列的起始位置和终止位置,从而得出我们要想的结果。
- 本道题要实现滑动窗口要确定如下三点:
- 窗口内是什么?
- 如何移动窗口的起始位置?
- 如何移动窗口的结束位置?
窗口就是 满足其和 ≥ s 的长度最小的 连续 子数组。
窗口的起始位置如何移动:如果当前窗口的值大于s了,窗口就要向前移动了(也就是该缩小了)。
窗口的结束位置如何移动:窗口的结束位置就是遍历数组的指针,也就是for循环里的索引。
代码如下
public int minSub(int nums[],int s)
{
int left=0;
int result=Integer.MAX_VALUE;
int sum=0;
for(int right=0;right<nums.length-1;right++)
{
//滑动窗口的移动逻辑
sum+=nums[right];
while(sum>s)
{
result=Math.min(result,right-left+1);
sum-=nums[left++];
}
}
return result==Integer.MAX_VALUE?0:result;//如果没有找到最大值 则返回0
}
Leecode59.螺旋矩阵II
题目链接
题目
给定一个正整数 n,生成一个包含 1 到 n^2 所有元素,且元素按顺时针顺序螺旋排列的正方形矩阵。
示例:
输入: 3 输出: [ [ 1, 2, 3 ], [ 8, 9, 4 ], [ 7, 6, 5 ] ]
思路
遵循与二分法类似的 循环不变量原则
全部都是左闭右开
接下来模拟顺时针画矩阵的过程:
- 填充上行从左到右
- 填充右列从上到下
- 填充下行从右到左
- 填充左列从下到上
用到的变量
1 创建个二维数组
2 n代表边长,loop代表循环的次数。(n/2获得)
3 start(start x ,start y)代表起始点的横纵坐标。
4,count 代表计数器,从1开始。
代码
public int[][] generate(int n)
{
int loop=0; //控制循环次数
int [][] res =new int[n][n]; //创建二维数组 res 里面的值
int start=0; //start x 和 start y
int count =1; //定义计数器
int i,j;
while(loop++< n/2) //根据边长来确定循环次数,规律是n/2
{ //模拟上层从左到右
for (j = start; j < n - loop; j++) //loop也就是边块
{
res[start][j] = count++;
}
//模拟右层从上到下
for (i = start; i < n - loop; i++) {
res[i][j] = count++;
}
//模拟下层从右到左
for (;j>=loop;j--)
{
res[i][j]=count++;
}
//模拟左层从下到上
for(;i>=loop;i--)
{
res[i][j]=count++;
}
start ++;
}
if(n%2==1)
{
res[start][start]=count;
}
return res;
}
总结
滑动窗口
主要要理解滑动窗口如何移动 窗口起始位置,达到动态更新窗口大小的,从而得出长度最小的符合条件的长度。
模拟行为
熟记掌握 循环不变量原则,万象不离其宗 作为面试频繁题型 我之后还要做做类似得
今日收获
今日分 第二题 和第三题 真是难得够呛 第三题更是一行一行抠得 今天好累,明天再复习一遍 休息了