LeetCode Sort系列(二)
1329 Sort the Matrix Diagonally
题目大意是给定一个m*n的矩阵,把矩阵里的每条对角线上的数从小到大排序。
很明显就需要逐一对每条对角线的数进行排序,首先明确有 m+n-1条对角线。其次就是每条对角线的起始点,横着的有m个起始点,竖着的就有n-1个起始点,横着的横坐标都是0,竖着的纵坐标都是0.
1 | class Solution { |
1305 All Elements in Two Binary Search Trees
题目大意是给定两棵二叉搜索树,把两棵树的所有元素从小到大排列。
这里可以根据BST的性质,分别通过中序遍历把元素存入两个list中,归并比较即可,中序遍历存放时其实就已经排好顺序了。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
58class Solution {
// 直接利用排序工具类排序
public List<Integer> getAllElements(TreeNode root1, TreeNode root2) {
List<Integer> res = new ArrayList<>();
helper(root1, res);
helper(root2, res);
Collections.sort(res);
return res;
}
// 比较排序
public List<Integer> getAllElements2(TreeNode root1, TreeNode root2) {
List<Integer> res = new ArrayList<>();
List<Integer> list1 = new ArrayList<>();
List<Integer> list2 = new ArrayList<>();
helper(root1, list1);
helper(root2, list2);
int l1 = 0, l2 = 0;
while(l1 < list1.size() && l2 < list2.size()) {
if (list1.get(l1) < list2.get(l2)) {
res.add(list1.get(l1));
l1++;
} else {
res.add(list2.get(l2));
l2++;
}
}
for(int i=l1; i<list1.size(); i++) res.add(list1.get(i));
for(int i=l2; i<list2.size(); i++) res.add(list2.get(i));
return res;
}
// discuss中比较的另一种写法
public List<Integer> getAllElements3(TreeNode root1, TreeNode root2) {
List<Integer> res = new ArrayList<>();
List<Integer> list1 = new ArrayList<>();
List<Integer> list2 = new ArrayList<>();
helper(root1, list1);
helper(root2, list2);
int l1 = 0, l2 = 0;
while(l1 < list1.size() || l2 < list2.size()){
if(l2 == list2.size() || l1 < list1.size() && list1.get(l1) <= list2.get(l2)){
res.add(list1.get(l1));
l1++;
} else if(l2 < list2.size()){
res.add(list2.get(l2));
l2++;
}
}
return res;
}
public void helper(TreeNode root, List<Integer> list) {
if (root == null) return;
helper(root.left, list);
list.add(root.val);
helper(root.right, list);
return;
}
}
969. Pancake Sorting
题目大意是给定一个大小为n数组,其中元素为从1到n,不断进行元素的反转即反转从1到k的元素(1到k的元素倒置),经过多少次后整个数组正好是升序排列,记录每次反转位置k,输出最后所有的k的列表。
这里面最核心的思路就是每次找到最大的元素的位置先放到第一个,再把最大的再进行一次反转到其应该在的位置。
1 | class Solution { |
1338. Filter Restaurants by Vegan-Friendly, Price and Distance
题目大意是给定一个二维数组类似餐馆,每一项中表示了餐馆的id、rate、veganfriendly、price、distan这些属性,然后根据给定各项属性来筛选符合条件的餐馆,veganfriendly属性需要大于等于给定的值,price和distance需要分别小于等于给定的值,按照rate从大到小排列餐馆id,rate相同id大的在前。
题目逻辑很简单,这里只列出这个利用java8 stream的写法,一开始用了流但是写的啰嗦了点,比如veganfriendly的判断,没有巧妙利用这个大于等于的逻辑,而是用了if-else,后来参考了discuss里面一行的解法选择这个。
1 | class Solution { |
- 本文链接:https://chlch.github.io/2020/01/28/LeetCode-Sort系列(二)/
- 版权声明:本博客所有文章除特别声明外,均采用 CC BY-NC-SA 3.0 CN 许可协议。欢迎转载,但是请转载请注明出处哦!