433. 最小基因变化(Queue使用ArrayList和LinkedList进行声明)

本文主要是介绍433. 最小基因变化(Queue使用ArrayList和LinkedList进行声明),希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

这道题可以看成一个24叉树。

因为基因序列长度固定为8,且每个位置的字母固定是AGCT,可以选择改变的只有3个字母,所以一次最多24种情况。

然后检查变化后的结果是否存在bank中(使用hashSet来存储),同时设置一个visited集合来检查是否访问过。

class Solution {public int minMutation(String startGene, String endGene, String[] bank) {if (startGene.equals(endGene))return 0;char[] keys = { 'A', 'G', 'C', 'T' };Set<String> cnt = new HashSet<>();Set<String> visited = new HashSet<>();for (String str : bank) {cnt.add(str);}if (!cnt.contains(endGene))return -1;Queue<String> q = new ArrayDeque<>();q.offer(startGene);visited.add(startGene);int step = 1;while (!q.isEmpty()) {int size = q.size();for (int i = 0; i < size; ++i) {String curr = q.poll();for (int u = 0; u < 8; ++u) {for (int v = 0; v < 4; ++v) {if (keys[v] != curr.charAt(u)) {StringBuffer sb = new StringBuffer(curr);sb.setCharAt(u, keys[v]);String next = sb.toString();if (!visited.contains(next) && cnt.contains(next)) {if (next.equals(endGene))return step;visited.add(next);q.offer(next);}}}}}++step;}return -1;}
}

拓展:Queue使用ArrayList和LinkedList进行声明的区别
在Java中,Queue可以使用ArrayList和LinkedList进行声明。这两种数据结构在实现Queue时有一些区别。

使用ArrayList声明Queue的区别:

  1. 底层数据结构

    • ArrayList基于动态数组实现,它可以动态增长和缩小。
    • 插入和删除元素可能涉及重新分配内存和数据复制。
  2. 适用场景

    • 当需要随机访问队列中的元素时,ArrayList是更好的选择,因为它支持通过索引直接访问元素。
    • 如果需要频繁对队列进行随机访问、而且对队列的修改操作相对较少时,可以考虑使用ArrayList实现Queue。

使用LinkedList声明Queue的区别:

  1. 底层数据结构

    • LinkedList基于双向链表实现,每个元素都指向前一个和后一个元素。
    • 插入和删除元素的时间复杂度为O(1),因为只需要调整指针而不需要大量数据的搬移。
  2. 适用场景

    • 当需要频繁对队列进行插入、删除操作时,LinkedList是更好的选择,因为它的插入和删除操作效率更高。
    • 如果队列的操作主要是在两端进行(即头部和尾部),比如经常需要在队列头部和尾部进行插入、删除操作,可以考虑使用LinkedList实现Queue。

综合考虑:

  • 如果对队列中的元素进行频繁的随机访问,可以选择ArrayList实现Queue。
  • 如果对队列中的元素进行频繁的插入、删除操作,可以选择LinkedList实现Queue。

在实际应用中,需要根据具体的场景和需求来选择合适的数据结构来实现Queue。

这篇关于433. 最小基因变化(Queue使用ArrayList和LinkedList进行声明)的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/596677

相关文章

Python使用FFmpeg实现高效音频格式转换工具

《Python使用FFmpeg实现高效音频格式转换工具》在数字音频处理领域,音频格式转换是一项基础但至关重要的功能,本文主要为大家介绍了Python如何使用FFmpeg实现强大功能的图形化音频转换工具... 目录概述功能详解软件效果展示主界面布局转换过程截图完成提示开发步骤详解1. 环境准备2. 项目功能结

SpringBoot使用ffmpeg实现视频压缩

《SpringBoot使用ffmpeg实现视频压缩》FFmpeg是一个开源的跨平台多媒体处理工具集,用于录制,转换,编辑和流式传输音频和视频,本文将使用ffmpeg实现视频压缩功能,有需要的可以参考... 目录核心功能1.格式转换2.编解码3.音视频处理4.流媒体支持5.滤镜(Filter)安装配置linu

Redis中的Lettuce使用详解

《Redis中的Lettuce使用详解》Lettuce是一个高级的、线程安全的Redis客户端,用于与Redis数据库交互,Lettuce是一个功能强大、使用方便的Redis客户端,适用于各种规模的J... 目录简介特点连接池连接池特点连接池管理连接池优势连接池配置参数监控常用监控工具通过JMX监控通过Pr

apache的commons-pool2原理与使用实践记录

《apache的commons-pool2原理与使用实践记录》ApacheCommonsPool2是一个高效的对象池化框架,通过复用昂贵资源(如数据库连接、线程、网络连接)优化系统性能,这篇文章主... 目录一、核心原理与组件二、使用步骤详解(以数据库连接池为例)三、高级配置与优化四、典型应用场景五、注意事

使用Python实现Windows系统垃圾清理

《使用Python实现Windows系统垃圾清理》Windows自带的磁盘清理工具功能有限,无法深度清理各类垃圾文件,所以本文为大家介绍了如何使用Python+PyQt5开发一个Windows系统垃圾... 目录一、开发背景与工具概述1.1 为什么需要专业清理工具1.2 工具设计理念二、工具核心功能解析2.

Linux系统之stress-ng测压工具的使用

《Linux系统之stress-ng测压工具的使用》:本文主要介绍Linux系统之stress-ng测压工具的使用,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录一、理论1.stress工具简介与安装2.语法及参数3.具体安装二、实验1.运行8 cpu, 4 fo

Java使用MethodHandle来替代反射,提高性能问题

《Java使用MethodHandle来替代反射,提高性能问题》:本文主要介绍Java使用MethodHandle来替代反射,提高性能问题,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑... 目录一、认识MethodHandle1、简介2、使用方式3、与反射的区别二、示例1、基本使用2、(重要)

使用C#删除Excel表格中的重复行数据的代码详解

《使用C#删除Excel表格中的重复行数据的代码详解》重复行是指在Excel表格中完全相同的多行数据,删除这些重复行至关重要,因为它们不仅会干扰数据分析,还可能导致错误的决策和结论,所以本文给大家介绍... 目录简介使用工具C# 删除Excel工作表中的重复行语法工作原理实现代码C# 删除指定Excel单元

Python程序的文件头部声明小结

《Python程序的文件头部声明小结》在Python文件的顶部声明编码通常是必须的,尤其是在处理非ASCII字符时,下面就来介绍一下两种头部文件声明,具有一定的参考价值,感兴趣的可以了解一下... 目录一、# coding=utf-8二、#!/usr/bin/env python三、运行Python程序四、

MySQL 事务的概念及ACID属性和使用详解

《MySQL事务的概念及ACID属性和使用详解》MySQL通过多线程实现存储工作,因此在并发访问场景中,事务确保了数据操作的一致性和可靠性,下面通过本文给大家介绍MySQL事务的概念及ACID属性和... 目录一、什么是事务二、事务的属性及使用2.1 事务的 ACID 属性2.2 为什么存在事务2.3 事务