代码随想录算法训练营第2天 | 数组滑动窗口、螺旋打印
1.代码随想录算法训练营第2天 | 数组滑动窗口、螺旋打印
2.代码随想录算法训练营第1天 | 数组二分法、数组双指针3.代码随想录算法训练营第3天 | 链表删除元素、翻转链表4.代码随想录算法训练营第4天 | 链表两两交换、删除倒N、链表相交、环形链表5.代码随想录算法训练营第6天 | 哈希表的应用、复习快慢指针思想6.代码随想录算法训练营第7天 | 哈希表和双指针结合、三数和四数之和7.代码随想录算法训练营第8天 | 复习字符串API、双指针8.代码随想录算法训练营第9天 | 复习字符串匹配、KMP9.代码随想录算法训练营第10天 | 复习队列和栈10.代码随想录算法训练营第11天 | 复习逆波兰表达式求值11.代码随想录算法训练营第13天 | 复习二叉树基础12.代码随想录算法训练营第14天 | 复习二叉树翻转13.代码随想录算法训练营第15天 | 二叉树进阶14.代码随想录算法训练营第16天 | 二叉树更加进阶15.代码随想录算法训练营第17天 | 复习二叉搜索树16.代码随想录算法训练营第18天 | 二叉搜索树进阶17.代码随想录算法训练营第20天 | 二叉搜索树中级18.代码随想录算法训练营第21天 | 二叉搜索树结尾19.代码随想录算法训练营第22天 | 开始复习回溯20.代码随想录算法训练营第23天 | 回溯进阶21.代码随想录算法训练营第24天 | 复习组合问题22.代码随想录算法训练营第25天 | 回溯问题完结23.代码随想录算法训练营第27天 | 初入贪心24.代码随想录算法训练营第28天 | 贪心进阶有序数组的平方。常规方法复习冒泡排序,也可以使用双指针。因为有序数组的平方,最大值一定在两侧,最小值在中间。可以两侧往中间收拢。
2024年7月4日笔记:双指针法,两侧往中间逼近一定是从大到小,然后给res数组倒着填即可实现从小到大。
题977. 有序数组的平方
class Solution {
public int[] sortedSquares(int[] nums) {
int len = nums.length;
int[] res = new int[len];
int l=0,r=len-1;
int cnt=len-1;
while(l<=r){
//看l大还是r大,谁大就先填谁然后向内移动一格
if(abs(nums[l])>abs(nums[r])){
res[cnt] = nums[l]*nums[l];
cnt-=1;
l+=1;
}else{
res[cnt] = nums[r]*nums[r];
cnt-=1;
r-=1;
}
}
return res;
}
public int abs(int x){
if(x<0){
return -x;
}else{
return x;
}
}
}
长度最小的子数组,重点复习滑动窗口。
始终维护sum等于l和r之间所有值的和,然后不断和target比较,如果大了l就进,如果小了r就进,每次记录长度,最后就可以获得满足要求的最小长度。
题209. 长度最小的子数组
class Solution {
public int minSubArrayLen(int target, int[] nums) {
int minLen=nums.length+1;
int l=0,r=0;//左闭右闭
int sum=nums[0];
while(r<nums.length){
if(sum>=target){
if(minLen>r-l+1){
minLen = r-l+1;
}
l+=1;
sum-=nums[l-1];
}else{
r+=1;
if(r<nums.length){
sum+=nums[r];
}
}
}
if(minLen==nums.length+1){
return 0;
}
return minLen;
}
}
螺旋矩阵
单独定义好边界,每轮过后更新边界,然后使用方向标记来记录当前的行进方向。
注意:
- x和y对应的行和列不要混淆;
- 上边界初始化时即可设置为1,其他边界初始化为0。
题59. 螺旋矩阵 II
class Solution {
public int[][] generateMatrix(int n) {
int[][] res = new int[n][n];
int cur = 1;//右下左上分别用1234代表,一开始是右侧
int x=0,y=0;//右正下正
int a1=n-1,a2=n-1,a3=0,a4=1;//代表初始边界
for(int i=1;i<=n*n;i++){
res[x][y]=i;
//如果当前是右侧,那么下一步只能右或者下
//右侧和下侧边界都是最多n-1
if(cur==1){
if(y+1>a1){
cur=2;
x+=1;
//更新右侧边界
a1-=1;
}else{
y+=1;
}
}else if(cur==2){
if(x+1>a2){
cur=3;
y-=1;
//更新下侧边界
a2-=1;
}else{
x+=1;
}
}else if(cur==3){
if(y-1<a3){
cur=4;
x-=1;
//更新左侧边界
a3+=1;
}else{
y-=1;
}
}else{
if(x-1<a4){
cur=1;
y+=1;
//更新上侧边界
a4+=1;
}else{
x-=1;
}
}
}
return res;
}
}
题54. 螺旋矩阵
class Solution {
public static List<Integer> spiralOrder(int[][] matrix) {
int m = matrix.length;
int n = matrix[0].length;
List<Integer> list1 = new ArrayList<>();
int cur = 1;
int a1=n-1,a2=m-1,a3=0,a4=1;//右下左上的起始边界
int x=0,y=0;
for(int i=0;i<m*n;i++){
list1.add(matrix[x][y]);
if(cur==1){
if(y+1>a1){
cur=2;
x+=1;
a1-=1;
}else{
y+=1;
}
}else if(cur==2){
if(x+1>a2){
a2-=1;
cur=3;
y-=1;
}else{
x+=1;
}
}else if(cur==3){
if(y-1<a3){
a3+=1;
cur=4;
x-=1;
}else{
y-=1;
}
}else{
if(x-1<a4){
a4+=1;
cur=1;
y+=1;
}else{
x-=1;
}
}
}
return list1;
}
}
合集:
代码随想录算法训练营
标签:
代码随想录
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 25岁的心里话
· 闲置电脑爆改个人服务器(超详细) #公网映射 #Vmware虚拟网络编辑器
· 零经验选手,Compose 一天开发一款小游戏!
· 因为Apifox不支持离线,我果断选择了Apipost!
· 通过 API 将Deepseek响应流式内容输出到前端