1. 程式人生 > 實用技巧 >Leetcode Task09:完成88、89、104題目並打卡

Leetcode Task09:完成88、89、104題目並打卡

Task09: 完成以下三個題目並打卡(1天)

088 合併兩個有序陣列

給你兩個有序整數陣列nums1 和 nums2,請你將 nums2 合併到nums1中,使 nums1 成為一個有序陣列。

初始化nums1 和 nums2 的元素數量分別為m 和 n 。你可以假設nums1有足夠的空間(空間大小等於m + n)來儲存 nums2 中的元素。

示例1

輸入:nums1 = [1,2,3,0,0,0], m = 3, nums2 = [2,5,6], n = 3
輸出:[1,2,2,3,5,6]

示例2

輸入:nums1 = [1], m = 1, nums2 = [], n = 0
輸出:[1]

提示:

  • 0 <= m, n <= 200
  • 1 <= m + n <= 200
  • nums1.length == m + n
  • nums2.length == n
  • -109 <= nums1[i], nums2[i] <= 109
class Solution {
    public void merge(int[] nums1, int m, int[] nums2, int n) {
        int p1 = m - 1, p2 = n - 1;
        int tail = m + n - 1;
        int cur;
        while (p1 >= 0 || p2 >= 0) {
            if (p1 == -1) {
                cur = nums2[p2--];
            } else if (p2 == -1) {
                cur = nums1[p1--];
            } else if (nums1[p1] > nums2[p2]) {
                cur = nums1[p1--];
            } else {
                cur = nums2[p2--];
            }
            nums1[tail--] = cur;
        }
    }
}

複雜度分析
時間複雜度 : O(n+m)。
空間複雜度 : O(1)。

089 格雷編碼

格雷編碼是一個二進位制數字系統,在該系統中,兩個連續的數值僅有一個位數的差異。

給定一個代表編碼總位數的非負整數 n,列印其格雷編碼序列。即使有多個不同答案,你也只需要返回其中一種。

格雷編碼序列必須以 0 開頭

示例1

輸入:2
輸出:[0,1,3,2]
解釋:
00 - 0
01 - 1
11 - 3
10 - 2

對於給定的n,其格雷編碼序列並不唯一。
例如,[0,2,3,1]也是一個有效的格雷編碼序列。

00 - 0
10 - 2
11 - 3
01 - 1

示例2

輸入:0
輸出:[0]
解釋: 我們定義格雷編碼序列必須以 0 開頭。
    給定編碼總位數為 n 的格雷編碼序列,其長度為 2n。當 n = 0 時,長度為 20 = 1。
    因此,當 n = 0 時,其格雷編碼序列為 [0]。
class Solution {
    public List<Integer> grayCode(int n) {
        List<Integer> res = new ArrayList<Integer>() {{ 
            add(0); 
        }};
        int head = 1;
        for (int i = 0; i < n; i++) {
            for (int j = res.size() - 1; j >= 0; j--)
                res.add(head + res.get(j));
            head <<= 1;
        }
        return res;
    }
}

104 二叉樹的最大深度

將一個按照升序排列的有序陣列,轉換為一棵高度平衡二叉搜尋樹。

本題中,一個高度平衡二叉樹是指一個二叉樹每個節點 的左右兩個子樹的高度差的絕對值不超過 1。

示例

給定有序陣列: [-10,-3,0,5,9],

一個可能的答案是:[0,-3,9,-10,null,5],它可以表示下面這個高度平衡二叉搜尋樹:

      0
     / \
   -3   9
   /   /
 -10  5
/**
 * Definition for a binary tree node.
 * public class TreeNode {
 *     int val;
 *     TreeNode left;
 *     TreeNode right;
 *     TreeNode() {}
 *     TreeNode(int val) { this.val = val; }
 *     TreeNode(int val, TreeNode left, TreeNode right) {
 *         this.val = val;
 *         this.left = left;
 *         this.right = right;
 *     }
 * }
 */
class Solution {
    public TreeNode sortedArrayToBST(int[] nums) {
        return helper(nums, 0, nums.length - 1);
    }

    public TreeNode helper(int[] nums, int left, int right) {
        if (left > right) {
            return null;
        }

        // 總是選擇中間位置左邊的數字作為根節點
        int mid = (left + right) / 2;

        TreeNode root = new TreeNode(nums[mid]);
        root.left = helper(nums, left, mid - 1);
        root.right = helper(nums, mid + 1, right);
        return root;
    }
}