2020-06-18
2020-06-18 21:08:16 # leetcode # daily diary

题目汇总

LeetCode 739. Daily Temperatures

算法思路

单调栈

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
class Solution {
public int[] dailyTemperatures(int[] T) {
// 典型的单调栈题目
Stack<Integer> stack = new Stack();
int[] res = new int[T.length];

for (int i = 0; i < T.length; i++) {
while (!stack.isEmpty() && T[stack.peek()] < T[i]) {
res[stack.peek()] = i - stack.peek();
stack.pop();
}
stack.push(i);
}

return res;
}
}

LeetCode 274. H-Index

算法思路

274和275我觉得是很垃圾的两道题,有点像脑筋急转弯。对于274题,其实就是找出一个数x,使得数组中大于等于x的数恰好为x个。

注意,这里找到的hindex不一定是数组里的数,例如:[4,0,6,1,5]的hindex就是3。

这里有个弯需要绕一下,就是while循环那里,我们的h要从小到大去遍历,而查找citation的数量需要从后向前找,因为这是一个相遇问题而不是追击问题。需要细品一下。

1
2
3
4
5
6
7
8
9
10
11
12
13
class Solution {
public int hIndex(int[] citations) {
Arrays.sort(citations);

// 最终的h的值一定是小于n的,看一下solution里的图就可以明白
int n = citation.length, h = 0;
while (h < n && citations[n - h - 1] > h) {
h++;
}

return h;
}
}

LeetCode 275. H-Index II

算法思路

和274基本一致,只是这里的array是有序的,用二分查找更方便。目标是找到一个target似的citations[i]
= n - i,如果没有这样的i,那么最终的left及其后面的数的数量就是h个。

1
2
3
4
5
6
7
8
9
10
11
12
13
class Solution {
public int hIndex(int[] citations) {
int idx = 0, n = citations.length;
int pivot, left = 0, right = n - 1;
while (left <= right) {
pivot = left + (right - left) / 2;
if (citations[pivot] == n - pivot) return n - pivot;
else if (citations[pivot] < n - pivot) left = pivot + 1;
else right = pivot - 1;
}
return n - left;
}
}

LeetCode 36. Valid Sudoku

算法思路

就是通过多个hashmap或者hashset来对每一行、每一列以及每一个box进行查找。

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
class Solution {
public boolean isValidSudoku(char[][] board) {
// 这道题只要判断数独是否合法,而不一定有解!!!
// 分情况讨论即可

// 检查每一行是否valid
for (int i = 0; i < 9; i++) {
Set<Character> dict = new HashSet();
for (int j = 0; j < 9; j++) {
if (board[i][j] != '.') {
if (dict.contains(board[i][j])) {
return false;
}
dict.add(board[i][j]);
}
}
}

// 检查每一列是否valid
for (int j = 0; j < 9; j++) {
Set<Character> dict = new HashSet();
for (int i = 0; i < 9; i++) {
if (board[i][j] != '.') {
if (dict.contains(board[i][j])) {
return false;
}
dict.add(board[i][j]);
}
}
}

// 检查每一个3x3小方框是否valid
Set<Character>[] dicts = new HashSet[9];
for (int i = 0; i < 9; i++) {
dicts[i] = new HashSet<Character>();
}

for (int i = 0; i < 9; i++) {
for (int j = 0; j < 9; j++) {
int id = (i / 3) * 3 + j / 3;
if (board[i][j] != '.') {
if (dicts[id].contains(board[i][j])) {
return false;
}
dicts[id].add(board[i][j]);
}
}
}

return true;
}
}