代码随想录刷题day 2 | 977.有序数组的平方、 209.长度最小的子数组、 59.螺旋矩阵II

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

最近做的都是之前做过几遍的题目,所以做起来还算得心应手,有点害怕后面没做过的题目压力会不会有点大,不过还是好好加油,不会的大不了就背呗,多做几遍会有感觉的。这两天的题目没有好好总结,这周天把这些都总结一下。

posted @ 2024-07-04 22:35  12点不睡觉还想干啥?  阅读(42)  评论(0)    收藏  举报