Java C++题解leetcode817链表组件示例

yizhihongxing

下面是Java C++题解leetcode817链表组件的完整攻略:

题目描述

给定链表头结点 head,该链表上的每个结点都有一个唯一的整型值。

同时给定列表 G,该列表是上述链表中整型值的一个子集。

返回列表 G 中组件的个数,这里的组件定义为:链表中一段最长连续节点的值(即链表的子段)在列表 G 中出现次数与该段中节点数目相同。(例如,如果组件中的节点数目为 2,且其中的值恰好为 G 中的两个值,这样的组件是合法的)

示例 1:

输入: 
head: 0->1->2->3
G = [0, 1, 3]
输出: 2
解释: 
链表中,0 和 1 是相连接的,且 G 中有它们都在链表中出现过。
同时,3 不在链表 G 中,所以不是组件。

示例 2:

输入: 
head: 0->1->2->3->4
G = [0, 3, 1, 4]
输出: 2
解释: 
链表中,0 和 1 是相连接的,3 和 4 是相连接的,且 G 中有它们都在链表中出现过。
注意: 

如果 N 是给定链表 head 的长度,范围在 [1, 10000]。
链表中每个节点的值范围在 [0, N - 1]。
1 <= G.length <= 10000
G 是链表中所有结点的值的一个子集。

## 解题思路

这道题让我们求链表 G 组件的个数,那么我们先遍历链表,用 HashMap 把链表中的值添加进去,然后再遍历一次链表,分割链表,找到组件的个数。

HashMap 的 key 存储链表中的值,value 值为 true,代表它在链表中存在。

对于链表的遍历,我们可以通过设置一个变量 `previous`,用来判断当前的节点和前一个节点是否都在集合 G 中,如果是,那么它们是同一组件的一部分,继续遍历,直到不在集合 G 中,说明已经遍历到一个组件的结束位置,计数器加 1 即可。

## 代码实现

我们可以分为两步来分别实现算法:

1. 遍历链表,用 HashMap 存储链表中的值;
2. 遍历链表,分割链表,找到组件的个数。

下面是代码实现(Java 语言):

```java
public int numComponents(ListNode head, int[] G) {
    Set<Integer> set = new HashSet<>();
    for (int g : G) {
        set.add(g);
    }

    int count = 0;
    boolean previousExist = false;
    while (head != null) {
        if (set.contains(head.val)) {
            if (previousExist == false) {
                count++;
            }
            previousExist = true;
        } else {
            previousExist = false;
        }
        head = head.next;
    }

    return count;
}

下面是代码实现(C++ 语言):

class Solution {
public:
    int numComponents(ListNode* head, vector<int>& G) {
        set<int> values(G.begin(), G.end());
        int count = 0;
        bool previousExist = false;
        while (head != nullptr) {
            if (values.count(head->val)) {
                if (previousExist == false) {
                    count++;
                }
                previousExist = true;
            } else {
                previousExist = false;
            }
            head = head->next;
        }
        return count;
    }
};

示例说明

示例 1

输入:

head: 0->1->2->3
G = [0, 1, 3]

输出:

2

解释:

链表中,0 和 1 是相连接的,且 G 中有它们都在链表中出现过。同时,3 不在链表 G 中,所以不是组件。所以一共有 2 个组件。

示例 2

输入:

head: 0->1->2->3->4
G = [0, 3, 1, 4]

输出:

2

解释:

链表中,0 和 1 是相连接的,3 和 4 是相连接的,且 G 中有它们都在链表中出现过。所以一共有 2 个组件。

本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:Java C++题解leetcode817链表组件示例 - Python技术站

(0)
上一篇 2023年6月27日
下一篇 2023年6月27日

相关文章

  • JavaScript实现继承的6种常用方式总结

    JavaScript实现继承的6种常用方式总结 本文主要介绍JavaScript实现继承的6种常用方式,包括原型链继承、构造函数继承、组合继承、寄生组合继承、ES6 class继承、Mixin继承。 1. 原型链继承 原型链继承是将子类的原型设置为父类的实例,通过原型链来实现继承。其实现步骤如下: function Parent() { this.name …

    other 2023年6月27日
    00
  • 能够让你事半功倍的JS utils工具函数详解

    能够让你事半功倍的JS Utils工具函数详解攻略 在JavaScript开发中,使用工具函数可以大大提高开发效率和代码质量。本攻略将详细讲解一些能够让你事半功倍的JS Utils工具函数,并提供两个示例说明。 1. 函数柯里化(Currying) 函数柯里化是一种将多个参数的函数转换为一系列只接受一个参数的函数的技术。这种技术可以帮助我们更灵活地使用函数,…

    other 2023年8月3日
    00
  • 关于ide:lazarus和codetyphon有什么区别

    下面是关于“关于IDE:Lazarus和CodeTyphon有什么区别”的完整攻略: 1. Lazarus和CodeTyphon简介 Lazarus和CodeTyphon都是基于Free Pascal开源集成开发环境(IDE),用于开发跨平台的应用程序。它们都提供了直观的用户界面和强大的功能,开发变得更加简单和高效。 2. Lazarus和CodeTypho…

    other 2023年5月7日
    00
  • MySQL配置文件my.cnf中文版对照

    首先让我们来讲解一下MySQL配置文件my.cnf中文版对照的详细攻略。 什么是my.cnf文件? my.cnf文件是MySQL的配置文件,MySQL根据该文件中的配置来读取和存储数据。my.cnf文件中包含了许多参数和选项,可以对MySQL数据库的行为进行自定义设置。在Linux等环境下,my.cnf文件通常位于/etc/my.cnf或/etc/mysql…

    other 2023年6月25日
    00
  • 解决IIS中应用程序池提供服务的进程无法响应Ping或进程关闭时间超过了限制

    这个问题通常发生在IIS应用程序池长时间运行后,进程无法响应Ping或进程关闭时间超过了限制。解决这个问题需要进行以下步骤: 1. 修改应用程序池的进程清理时间 默认情况下,IIS会每1740分钟关闭一个工作进程来清除任何未完成的请求并释放资源。这可能会导致在重启新的工作进程之前丢失一些请求。可以通过修改应用程序池的“进程身份验证”设置来更改这个时间。 在I…

    other 2023年6月25日
    00
  • 华为P8很开总是提示空间占用90%以上怎么办?

    华为P8空间占用过高的解决攻略 如果你的华为P8手机空间占用超过90%,以下是一些解决方法和建议: 1. 清理缓存和临时文件 缓存和临时文件可能会占用大量的存储空间。你可以通过以下步骤清理它们: 打开手机的设置菜单。 搜索并选择“存储”选项。 在存储页面中,你会看到已使用的存储空间的详细信息。 点击“缓存数据”或类似的选项。 确认清除缓存数据。 这样做可以释…

    other 2023年8月1日
    00
  • uniapp实现全局设置字体大小(小中大的字体切换)

    Uniapp是一个跨平台的应用框架,可以方便地将一个代码库同时构建成iOS、Android、H5等多个端的应用。在本文中,将详细讲解如何使用Uniapp实现全局设置字体大小(小中大的字体切换)的完整攻略。 一、方案概述 要实现全局设置字体大小的话,需要具备以下三个条件: 维护一个全局状态,记录当前的字体大小; 在应用启动时,从本地持久化存储加载字体大小; 在…

    other 2023年6月27日
    00
  • Java封装统一的Result Model案例

    Java封装统一的Result Model是一种常见的编码规范,通常用于统一处理API接口的响应数据。本文将为大家提供完整的攻略,涵盖该编码规范的详细说明和使用示例。 1. 什么是Java封装统一的Result Model Java封装统一的Result Model是一种约定俗成的编码规范,它通过封装响应数据的格式,使得API接口的响应数据具有统一的标准格式…

    other 2023年6月25日
    00
合作推广
合作推广
分享本页
返回顶部