8月10日 leetcode 88、94
88. 合併兩個有序陣列(simple)
給你兩個有序整數陣列 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]
提示:
nums1.length == m + n
nums2.length == n
0 <= m, n <= 200
1 <= m + n <= 200
-109 <= nums1[i], nums2[i] <= 109
錯誤的想法:
設定一個count計數,比較nums1{count]和nums[0] 大小,然後插入nums1並且在nums2中擦除資料。
錯誤原因:無法判定邊界條件。
方法一:直接合並後排序演算法
最直觀的方法是先將陣列 nums2放進陣列 nums1的尾部,然後直接對整個陣列進行排序。
方法二:雙指標演算法
方法一沒有利用陣列 nums 1與 nums 2已經被排序的性質。為了利用這一性質,我們可以使用雙指標方法。這一方法將兩個陣列看作佇列,每次從兩個陣列頭部取出比較小的數字放到結果中。
class Solution {
public:
void merge(vector<int>& nums1, int m, vector<int>& nums2, int n) {
for (int i = 0; i != n; ++i) {
nums1[m + i] = nums2[i];
}
sort(nums1.begin(), nums1.end());
}
};
94. 二叉樹的中序遍歷(simple)
給定一個二叉樹的根節點 root
,返回它的 中序
示例 1:
輸入:root = [1,null,2,3]
輸出:[1,3,2]
示例 2:
輸入:root = []
輸出:[]
示例 3:
輸入:root = [1]
輸出:[1]
示例 4:
輸入:root = [1,2]
輸出:[2,1]
示例 5:
輸入:root = [1,null,2]
輸出:[1,2]
提示:
樹中節點數目在範圍 [0, 100] 內
-100 <= Node.val <= 100
/**
* Definition for a binary tree node.
* struct TreeNode {
* int val;
* TreeNode *left;
* TreeNode *right;
* TreeNode() : val(0), left(nullptr), right(nullptr) {}
* TreeNode(int x) : val(x), left(nullptr), right(nullptr) {}
* TreeNode(int x, TreeNode *left, TreeNode *right) : val(x), left(left), right(right) {}
* };
*/
//非遞迴演算法
#include <stack>
class Solution {
public:
vector<int> a;
vector<int> inorderTraversal(TreeNode* root) {
stack<TreeNode*> s;
TreeNode * cur=root;
while(cur || !s.empty())
{
while(cur)
{
s.push(cur);
cur=cur->left;
}
cur=s.top();
s.pop();
a.push_back(cur->val);
cur=cur->right;
}
return a;
}
};
本文來自部落格園,作者:ahrismile,轉載請註明原文連結:https://www.cnblogs.com/ahrismile/p/15123256.html