极客时间算法训练营 Week03
作者:jjn0703
- 2021 年 12 月 05 日
本文字数:1147 字
阅读完需:约 4 分钟
本周是课程的第三周,我们学习了递归、分治、树、图的遍历等算法。
其中,树是学习的关键点,包括树的遍历、前中后序遍历的特点。树按层遍历、按深度优先方式遍历等。
作业题目如下:
23. Merge k Sorted Lists
class Solution {
public ListNode mergeKLists(ListNode[] lists){
if(lists.length == 0)
return null;
if(lists.length == 1)
return lists[0];
if(lists.length == 2){
return mergeTwoLists(lists[0],lists[1]);
}
int mid = lists.length/2;
ListNode[] l1 = new ListNode[mid];
for(int i = 0; i < mid; i++){
l1[i] = lists[i];
}
ListNode[] l2 = new ListNode[lists.length-mid];
for(int i = mid,j = 0; i < lists.length; i++, j++){
l2[j] = lists[i];
}
return mergeTwoLists(mergeKLists(l1), mergeKLists(l2));
}
private ListNode mergeTwoLists(ListNode l1, ListNode l2) {
if (l1 == null) return l2;
if (l2 == null) return l1;
ListNode head = null;
if (l1.val <= l2.val){
head = l1;
head.next = mergeTwoLists(l1.next, l2);
} else {
head = l2;
head.next = mergeTwoLists(l1, l2.next);
}
return head;
}
}
复制代码
47. Permutations II
class Solution {
private List<List<Integer>> res = new ArrayList<>();
private Set<String> set = new HashSet<>();
public List<List<Integer>> permuteUnique(int[] nums) {
// 回溯
backtrack(nums, new ArrayList<>());
return res;
}
private void backtrack(int[] nums, List<Integer> idxList) {
// 如果所有元素都排列过
if (idxList.size() == nums.length) {
List<Integer> list = new ArrayList<>();
// 通过索引list,构建元素list
for (int index : idxList) list.add(nums[index]);
if (!set.contains(list.toString())) {
set.add(list.toString());
res.add(list);
}
return;
}
for (int i = 0; i < nums.length; i++) {
// 如果nums[i]已经排序过,则跳过
if (idxList.contains(i)) continue;
idxList.add(i);
backtrack(nums, idxList);
idxList.remove(idxList.size() - 1);
}
}
}
复制代码
划线
评论
复制
发布于: 1 小时前阅读数: 7
jjn0703
关注
Java工程师/终身学习者 2018.03.26 加入
USTC硕士/健身健美爱好者/Java工程师.
评论