[杨小白]_leetcode_力扣_第 321 场周赛-第三题

74 阅读1分钟

开启掘金成长之旅!这是我参与「掘金日新计划 · 12 月更文挑战」的第9天,点击查看活动详情

前言

小白算法比较菜,希望能激励我每日更新,从leetcode第一题开始,2022年目标1900分,现在1806!!

力扣第 321 场周赛-力扣

第 321 场周赛

周日打周赛的人都不多了,之前周赛都有6000来人打,可能现在秋招结束了吧,都快跌破5000了。

image.png

2487. 从链表中移除节点

给你一个链表的头节点 head 。

对于列表中的每个节点 node ,如果其右侧存在一个具有 严格更大 值的节点,则移除 node 。

返回修改后链表的头节点 head 。

示例1:

image.png

输入: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结尾也是很欣慰了!

img.png