0%

LeetCode-Day7

22. 括号生成

给出 n 代表生成括号的对数,请你写出一个函数,使其能够生成所有可能的并且有效的括号组合。

例如,给出 n = 3,生成结果为:

1
2
3
4
5
6
7
[
"((()))",
"(()())",
"(())()",
"()(())",
"()()()"
]
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
class Solution {
public:
void dfs(int N, int l, int r,string str, vector<string>& ans) {
if(r > l || l > N || r > N) {
return ;
}
if(l == r && l == N) {
cout << str << endl;
ans.push_back(str);
return ;
}
dfs(N, l + 1, r, str + '(', ans);
dfs(N, l, r + 1, str + ')', ans);
}

vector<string> generateParenthesis(int n) {
vector<string> ans;
dfs(n, 0, 0, "", ans);
return ans;
}
};

解释:暴力构造法+剪枝(递归)

递归出口:

  • 左括号数量小于右括号数量

  • 左括号或右括号的数量大于n

  • 左括号数量和有括号数量相等,且等于n,即符合题意的解

23. 合并k个排序链表

合并 k 个排序链表,返回合并后的排序链表。请分析和描述算法的复杂度。

示例:

1
2
3
4
5
6
7
输入:
[
1->4->5,
1->3->4,
2->6
]
输出: 1->1->2->3->4->4->5->6
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
/**
* Definition for singly-linked list.
* struct ListNode {
* int val;
* ListNode *next;
* ListNode(int x) : val(x), next(NULL) {}
* };
*/
class Solution {
public:
ListNode* mergeTwoLists(ListNode* l1, ListNode* l2) {
if(l1 == NULL) {
return l2;
}
if(l2 == NULL) {
return l1;
}
ListNode* cur = (ListNode*)malloc(sizeof(ListNode));
ListNode* htmp = cur;
ListNode* cur1 = l1;
ListNode* cur2 = l2;
while(cur1 != NULL && cur2 != NULL) {
if(cur1->val <= cur2->val) {
cur->next = cur1;
cur1 = cur1->next;
cur = cur->next;
} else {
cur->next = cur2;
cur2 = cur2->next;
cur = cur->next;
}
}
if(cur1 != NULL) {
cur->next = cur1;
}
if(cur2 != NULL) {
cur->next = cur2;
}
return htmp->next;
}

ListNode* _mergeKLists(vector<ListNode*>& lists, int begin, int end) {
if(end < begin) {
return NULL;
}
if(end == begin) {
return lists[begin];
}
int mid = (begin + end) / 2;
ListNode* p1 = _mergeKLists(lists, begin, mid);
ListNode* p2 = _mergeKLists(lists, mid + 1, end);
return mergeTwoLists(p1, p2);
}

ListNode* mergeKLists(vector<ListNode*>& lists) {
return _mergeKLists(lists, 0, lists.size() - 1);
}
};

解释:关于k路归并,这里采用了优先队列合并

递归 + 二分