Day2 |977.有序陣列的平方& 209.長度最小的子陣列&59.螺旋矩陣II

flydandelion發表於2024-07-04

977.有序陣列的平方

這題太簡單了,中間的排序我用的選擇排序

貼程式碼了

public int[] sortedSquares(int[] nums) {
        for (int i = 0; i < nums.length; i++) {
            nums[i] = nums[i]*nums[i];
        }
        for (int i = 0; i < nums.length; i++) {
            int min = i;
            for (int j = i+1; j < nums.length; j++) {
                if(nums[min]>nums[j]){
                    min = j;
                }
            }
            if(nums[min]!=nums[i]){
                int tmp = nums[i];
                nums[i] = nums[min];
                nums[min] = tmp;
            }
        }
        return nums;
    }

209.長度最小的子陣列

思路 : 我剛開始想的解法就是雙指標滑動解法,如果使用雙指標滑動暴力解法最後在力扣裡面會超時,但是自己測試沒有問題

但是想透過力扣確實還需要最佳化成下面所謂的滑動視窗的解法.

@Test
    public void test2() {
        int[] nums = {2, 3, 1, 2, 4, 3};
        int target = 7;
        System.out.println(minSubArrayLen2(target, nums));
    }

    public int minSubArrayLen(int target, int[] nums) {//雙指標暴力解法
        int sum;
        int res = Integer.MAX_VALUE;
        if (target == 0) {
            return 0;
        }

        for (int i = 0; i < nums.length; i++) {
            sum = 0;
            for (int j = i; j < nums.length; j++) {
                sum += nums[j];
                if (sum >= target) {
                    if (res > j - i + 1) {
                        res = j - i + 1;
                        break;
                    }
                }
            }
        }
        if (res == Integer.MAX_VALUE) return 0;
        return res;
    }

    public int minSubArrayLen2(int target, int[] nums) {//比較簡潔的解法,也就是所謂的滑動視窗解法
        int left = 0;
        int right = 0;
        int res = Integer.MAX_VALUE;
        int sum = nums[0];

        while (true) {
            if (sum >= target) {
                if (res > right - left + 1) {
                    res = right - left + 1;
                }
                sum -= nums[left];
                left++;

            } else {
                right++;
                if (right >= nums.length) {
                    if (res == Integer.MAX_VALUE) return 0;
                    else return res;
                }
                sum += nums[right];

            }
        }

59.螺旋矩陣II

這題我之前做過對角線矩陣和旋轉矩陣,我一般的思路都是直接模擬矩陣,然後把矩陣構造出來

至於這種方式在之後的矩陣題目中可不可行,還有待驗證.

	@Test
    public void test3() {
        int n = 4;
        int[][] res = generateMatrix(n);
        for (int i = 0; i < res.length; i++) {
            for (int j = 0; j < res.length; j++) {
                System.out.print(res[i][j] + "\t");
            }
            System.out.println();
        }
    }

    public int[][] generateMatrix(int n) {
        int[][] matrix = new int[n][n];

        int num = 1;
        int l = 0;
        int r = n - 1;
        int t = 0;
        int b = n - 1;
        while (num <= n * n) {
            for (int i = l; i <= r; i++) {// 從左向右
                matrix[t][i] = num;
                num++;
            }
            t++;
            for (int i = t; i <= b; i++) { // 從上到下
                matrix[i][r] = num;
                num++;
            }
            r--;
            for (int i = r; i >= l; i--) { //從右到左
                matrix[b][i] = num;
                num++;
            }
            b--;
            for (int i = b; i >= t; i--) { // 從下到上
                matrix[i][l] = num;
                num++;
            }
            l++;
        }
        return matrix;

    }

小插曲 關於動態規劃

動態規劃今天有些頓悟,但還需要驗證自己的想法

猜想 :

  1. 動態規劃是透過轉移方程體現動態的

  2. 動態規劃是透過計算所有情況的狀態,存入陣列,來實現對某一狀態的快速查詢

  3. 動態規劃中很多狀態的重複轉移導致我們可以把這類情況總結為一個狀態轉移方程

  4. 一般可以寫成動態規劃的題都有一部分可以使用遞迴的特徵

  5. 動態規劃有一些狀態不在可重複轉移的過程中,因此狀態轉移方程才出現常見的解題思路中的邊界條件,其實邊界條件理解為另外的狀態轉移方程比較好.

  6. 狀態轉移方程分為兩個:

    • 一般情況下的狀態轉移方程
    • 邊界情況下的狀態轉移方程
  7. 關於使用動態規劃思維的題的返回值,通常是狀態轉移的目標結果.

以上均為我的猜想,目前還沒有驗證猜想,等後續更新吧.

相關文章