开启掘金成长之旅!这是我参与「掘金日新计划 · 12 月更文挑战」的第9天,点击查看活动详情
前言
小白算法比较菜,希望能激励我每日更新,从leetcode第一题开始,2022年目标1900分,现在1806!!
力扣第 321 场周赛-力扣
第 321 场周赛
周日打周赛的人都不多了,之前周赛都有6000来人打,可能现在秋招结束了吧,都快跌破5000了。
2487. 从链表中移除节点
给你一个链表的头节点 head 。
对于列表中的每个节点 node ,如果其右侧存在一个具有 严格更大 值的节点,则移除 node 。
返回修改后链表的头节点 head 。
示例1:
输入:head = [5,2,13,3,8]
输出:[13,8]
解释:需要移除的节点是 5 ,2 和 3 。
- 节点 13 在节点 5 右侧。
- 节点 13 在节点 2 右侧。
- 节点 8 在节点 3 右侧。
示例 2:
- 输入: head = [1,1,1,1]
- 输出: [1,1,1,1]
- 解释: 每个节点的值都是 1 ,所以没有需要移除的节点。
提示
- 给定列表中的节点数目在范围
[1, 105]内 1 <= Node.val <= 105
2.代码
确实可以放在链表里面做,但是做起来就略麻烦了,拿到数组里面做,无非是多加个O(n)的复杂度。
拿到链表转换成的数组之后,从后往前做单调栈,将不符合的置为-1(因为本题的数据不包括负数)
然后从头遍历一遍,把大于0的数,重新串起来做一个链表即可。
/**
* Definition for singly-linked list.
* public class ListNode {
* int val;
* ListNode next;
* ListNode() {}
* ListNode(int val) { this.val = val; }
* ListNode(int val, ListNode next) { this.val = val; this.next = next; }
* }
*/
class Solution {
public ListNode removeNodes(ListNode head) {
int[] arr = new int[100000];
int index = 0;
while (head!=null) {
arr[index] = head.val;
head = head.next;
index++;
}
int max = 0;
for (int i = index - 1; i >= 0; i--) {
if (max > arr[i]) {
arr[i] = -1;
} else {
max = arr[i];
}
}
ListNode res = new ListNode(0);
ListNode cur = res;
for (int i = 0; i < index; i++) {
if (arr[i]!= -1) {
cur.next = new ListNode(arr[i]);
cur = cur.next;
}
}
return res.next;
}
}
3.结束
这次力扣没想到周三早上就出分了,还挺快,已经knight了
11月以上knight结尾也是很欣慰了!