有序陣列的平方。常規方法複習氣泡排序,也可以使用雙指標。因為有序陣列的平方,最大值一定在兩側,最小值在中間。可以兩側往中間收攏。
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;
}
}