程式碼隨想錄演算法訓練營第2天 | 陣列滑動視窗、螺旋列印

hailicy發表於2024-07-04

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

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;
    }
}

相關文章