Leetcode Task09:完成88、89、104題目並打卡
阿新 • • 發佈:2021-01-20
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;
}
}