程式碼隨想錄刷題day 2 | 977.有序陣列的平方、 209.長度最小的子陣列、 59.螺旋矩陣II

12点不睡觉还想干啥?發表於2024-07-04

977. 有序陣列的平方

class Solution {
    public int[] sortedSquares(int[] nums) {
        int[] ans = new int[nums.length];
        int left = 0, right = nums.length - 1;
        for(int i = nums.length - 1; i>= 0; i--){
            if(nums[right] * nums[right] > nums[left] * nums[left]){
                ans[i] = nums[right] * nums[right]; 
                right--;
            }else{
                ans[i] =  nums[left] * nums[left];
                left++;
            }
        }
        return ans;
    }
}

76. 最小覆蓋子串

哇這個題有點噁心的,倒不是思路難,主要還是java的map太難用了,之前用python寫過這道題,當時沒覺得有這麼離譜;其實還可以再最佳化,但實在看不下去了,這次能寫出來就不錯了

class Solution {
    public String minWindow(String s, String t) {
        String ans = "";
        if(s.length() < t.length()) return ans;
        int[] cntS = new int[128];  //記錄字串的字元
        int[] cntT = new int[128];  //記錄target串字元
        for(char c: t.toCharArray()){
            cntT[c]++;
        }
        int left = 0, right = 0, aLeft = -1, aRight = s.length();
        char[] ss = s.toCharArray();
        for(; right < s.length(); right++){
            cntS[ss[right]]++;  //區間擴充套件需要給map中value更新
            while(isCovered(cntS, cntT)){
                if(right - left < aRight - aLeft){  // 如果新的字串長度小於之前最優的,則更新
                    aLeft = left;
                    aRight = right;
                }
                cntS[ss[left++]]--;  //區間收縮
            }
        }
        return aLeft == -1 ? "" : s.substring(aLeft, aRight+1);
    }

    public boolean isCovered(int[] cnt1, int[] cnt2){
        for(int i = 0; i < 128; i++){
            if(cnt1[i] < cnt2[i]) return false;
        }
        return true;
    }
}

59. 螺旋矩陣 II

這道題看過一個非常好的題解,多溫習溫習,這類題應該就不會出錯了

class Solution {
    public int[][] generateMatrix(int n) {
        int l = 0, r = n-1, u = 0, d = n-1;
        int i = 1;
        int[][] ans = new int[n][n];
        while(i <= n * n){
            for(int j = l; j <= r; i++, j++){
                ans[u][j] = i;
            }
            u++;
            for(int j = u; j <= d; i++, j++){
                ans[j][r] = i;
            }
            r--;
            for(int j = r; j >= l; i++, j--){
                ans[d][j] = i;
            }
            d--;
            for(int j = d; j >= u; i++, j--){
                ans[j][l] = i;
            }
            l++;
        }
        return ans;
    }
}

最近做的都是之前做過幾遍的題目,所以做起來還算得心應手,有點害怕後面沒做過的題目壓力會不會有點大,不過還是好好加油,不會的大不了就背唄,多做幾遍會有感覺的。這兩天的題目沒有好好總結,這周天把這些都總結一下。

相關文章