题目1:5554. 能否连接形成数组
遍历
思路:依次取出pieces
数组中的子数组,在arr
中寻找当前子数组头元素然后一一匹配,如果能够匹配完成则进行下一次匹配,如果所有的子数组全部匹配完成则说明pieces
数组可以串联成arr
class Solution {
public boolean canFormArray(int[] arr, int[][] pieces) {
for (int i = 0; i < pieces.length; i++) {
int index = 0;
int len = pieces[i].length;
for (int j = 0; j < arr.length; j++) {
if (arr[j] == pieces[i][index]){
index++;
if (index == len) break;
}
}
if (index != len) return false;
}
return true;
}
}
滑动窗口
可以将pieces数组中的子数组看作一个窗口,窗口的长度L为子数组的大小,遍历pieces数组,通过滑动窗口匹配arr数组如果匹配成功则计数器加一,如果pieces数组中所有子数组都匹配成功也就是计数器大小等于pieces长度时,说明pieces数组能够连接成arr数组
class Solution {
public boolean canFormArray(int[] arr, int[][] pieces) {
int count = 0;
for (int[] p : pieces) {
int L = p.length;// 滑动窗口大小
for (int i = 0; i <= arr.length - L; i++) {
int index = 0; // 子数组下标
for (int j = i; j < i+L; j++) {
if (arr[j] != p[index]) { // 匹配不成功滑动窗口继续匹配
break;
}
index++;
}
if (index == L) { // index == L 说明匹配成功
count++;
}
}
}
return count == pieces.length;
}
}
题目二:5555. 统计字典序元音字符串的数目
回溯
class Solution {
LinkedList<char[]> ans = new LinkedList<>();
int count = 0;
public int countVowelStrings(int n) {
// 新建一个二维数组,保存音符及其对应的下标,用来判断是否满足字符表顺序
char[][] chars = new char[][]{{'a','0'},{'e','1'},{'i', '2'},{'o','3'},{'u','4'}};
backTrace(0, chars, n);
return count;
}
private void backTrace(int depth, char[][] arr,int n) {
if (depth == n) {// 取了n个音符后计数加一
count++;
return;
}
for (int i = 0; i < arr.length; i++) {
if (ans.isEmpty() || ans.peekLast()[1] <= arr[i][1]) // 不符合要求的音符不能取
ans.add(arr[i]);
else
continue;
backTrace(depth + 1, arr, n);
ans.removeLast();
}
}
}
题目三:5556. 可以到达的最远建筑
最小堆加贪心
class Solution {
public int furthestBuilding(int[] heights, int bricks, int ladders) {
LinkedList<Integer> stack = new LinkedList<>();
int n = heights.length;
PriorityQueue<Integer> minQue = new PriorityQueue<>();
// 需要使用砖块的 delta h 的和
int sumH = 0;
for (int i = 1; i < n; i++) {
int deltaH = heights[i] - heights[i-1];
if (deltaH > 0) {
minQue.offer(deltaH);
// 如果优先队列已满,需要拿出一个其中的最小值,改为使用砖块
if (minQue.size() > ladders) {
sumH += minQue.poll();
}
if (sumH > bricks) {
return i - 1;
}
}
}
return n-1;
}
}