Leetcode刷题 2021.01.29
Leetcode950 按递增顺序显示卡牌
牌组中的每张卡牌都对应有一个唯一的整数。你可以按你想要的顺序对这套卡片进行排序。
最初,这些卡牌在牌组里是正面朝下的(即,未显示状态)。
现在,重复执行以下步骤,直到显示所有卡牌为止:
从牌组顶部抽一张牌,显示它,然后将其从牌组中移出。
如果牌组中仍有牌,则将下一张处于牌组顶部的牌放在牌组的底部。
如果仍有未显示的牌,那么返回步骤 1。否则,停止行动。
返回能以递增顺序显示卡牌的牌组顺序。
答案中的第一张牌被认为处于牌堆顶部。
乍看之下好像看不出什么规律,所以逆向思维反着来,这样就比较简单了,就是把每一次的队尾放到队头去然后再加上一个新的元素就可以了。java里可以使用LinkedList进行模拟。
class Solution {
public int[] deckRevealedIncreasing(int[] deck) {
LinkedList<Integer> queue = new LinkedList<>();
//先排下序
Arrays.sort(deck);
//倒着模拟,每次将队尾放到对头去,然后在队头加入一个新的元素
for(int i = deck.length - 1; i >= 0; i--){
if (!queue.isEmpty()){
queue.offerFirst(queue.pollLast());
}
queue.offerFirst(deck[i]);
}
//返回数组
int[] res = new int[deck.length];
int i = 0;
for(int ele : queue){
res[i++] = ele;
}
return res;
}
}
Leetcode1631 最小体力消耗路径
你准备参加一场远足活动。给你一个二维 rows x columns 的地图 heights ,其中 heights[row][col] 表示格子 (row, col) 的高度。一开始你在最左上角的格子 (0, 0) ,且你希望去最右下角的格子 (rows-1, columns-1) (注意下标从 0 开始编号)。你每次可以往 上,下,左,右 四个方向之一移动,你想要找到耗费 体力 最小的一条路径。
一条路径耗费的 体力值 是路径上相邻格子之间 高度差绝对值 的 最大值 决定的。
请你返回从左上角走到右下角的最小 体力消耗值 。
拿到这种题只会无脑dfs,然后直接TLE。看到题解说这道题也算是比较经典的题目了,还是题刷的不够多啊。有最小最大之类的,可以看看是否能用二分查找找到一个值。这题可以二分查找加搜索,或者使用并查集。
class Solution {
int[][] directions = new int[][]{
{
-1, 0}, {
1, 0}, {