数组
【二分查找】
我个人觉得掌握一个就行了,选择了左闭右闭。
停止条件时,一定是right在前,left在后的退出状态,而left right的夹缝中,就是要插入的位置,不然呢,最后肯定是在正确位置附近转啊。Right left移动到最后肯定都会重合,不管重合在6节点还是8节点,最后都会变成下面这个,然后退出。
还有一点:mid的计算:mid=left+(right-left)/2; 位运算的写法是防止left+right溢出;
重要问题 int mid=left+((right-left)>>1); 如果写成 int mid=left+(right-left)>>1;由于>>优先级比+低,会先计算加法left+(right-left),最后才>>1;
做题情况
好久不写了,大概样子能写出来,但是左闭右闭这些细节是忘记了。
【双指针】
27.移除元素
给你一个数组 nums
和一个值 val
,你需要 原地 移除所有数值等于 val
的元素,并返回移除后数组的新长度。
主要就是将val和非val值进行交换。
卡住的地方在于移除后数组的新长度的计算,首先是题目就看错了,捣鼓了好一会。
977.有序数组的平方
转化为合并两个有序数组,我写的和别人不一样的地方在于我的双指针是从中间开始的,题解都是从两边开始,确实更方便点。
卡住的地方在于中间指针位置的计算,很容易超出下标(对于只有一个元素的情况),所以从两边开始下次可以试试。
滑动窗口209.长度最小的子数组
求sum ,两个指针,少了就加,多了就减。
卡住的地方在于看错题目,满足其总和大于等于 target
的子数列。
【模拟行为】
59.螺旋矩阵II
我的方法是定义了四个方向,分别为右下左上,然后每个方向上都有停止条件,满足了就换下一个方向,同时定义了level,level自增的位置也是个值得注意的点。
class Solution {
public int[][] generateMatrix(int n) {
int[][] ans=new int[n][n];//n*n的矩阵
int[] directions={0,1,0,-1,0};//四个方向 右 下 左 上
int x=0,y=0;
int level=0;
int dx=0;
int dy=1;
for(int i=1;i<=n*n;i++){
System.out.println(x+" "+y);
ans[x][y]=i;
if(dx==0 && y+level==n-1 ){//遇到情况要转向
dx=1;dy=2;
}else if(dx==1 && x+level==n-1 ){
dx=2;dy=3;
}else if(dx==2 && y-level==0){
dx=3;dy=4;level+=1;
}else if(dx==3 && x-level==0){
dx=0; dy=1;
}
x+=directions[dx];
y+=directions[dy];
}
return ans;
}
}