数据结构与算法--再来聊聊数组
再来聊聊数组
- 这篇我们来总结一下数组相关的一些算法,数组的特点在于我们能通过下标得到对应数据,时间复杂度在O(1),之前有多篇文章有数组相关的体系,一下来一个归纳:
数据结构与算法–判断扑克牌是否顺子
数据结构与算法–翻转单词顺序
数据结构与算法–有序数组中找出和为s的两个数字
数据结构与算法–第一个只出现一次的字符
数据结构与算法–数组中出一次的数字
数据结构与算法–数字在排序数组中出现次数
数据结构与算法–数组中的逆序对
数据结构与算法–将数组排成最小的数
数据结构与算法-- 数组中出现次数超过一半的数字(时间复杂度的讨论)
数据结构与算法–数组:二维数组中查找
数据结构与算法–字符串的排列组合问题
数据结构与算法–回朔,矩阵中查找字符串路径
数据结构与算法–字符串:字符串替换
数据结构与算法–查找与排序另类用法
数据结构与算法–经典10大排序算法(动图演示)【建议收藏】
- 以上是现阶段已经解除的数组相关,包括字符串其实也就是数组问题,其中用的最多的是双指针,还有就是归并法,二分法,其中排序是最重要的,在最后一排10大排序算法中详细介绍了每一种排序,并有动图演示。有的根据数组中数据的特殊性进行解题,例如出现一次的数字,利用位运算相关知识,还有排序算法思想的另类用法,利用排序思想进行查询。等,发现还是基础知识的运用最重要。
- 以上文章中都与是运用数组进行解题,或者是其中有一个方法是用的数组。
- 接下来是今天的题目:
最长子串问题:给定一个字符串,找出字符串中的最长子串,使得这个子串中没有重复的数字
- 因为写过之前的题目:有序数组中找出和为s的两个数字 ,我第一反应就是双指针遍历数组,分析如下:
- 指针start,end都从0,开始,在end < length-1 情况下让end++
- 判断当前指针范围内是否有重复数字,
- 如果有,当前最长子串就是 maxTemp = start ~ end-1,先判断最长子串与当前maxTemp大小,取最大值,此时我们将start++
- 如果没有重复数字,那么我们继续end++
- 继续如上步骤,知道end = length-1 或者start > end
- 以上遍历一次能得到最终值,但是在判断当前范围是否重复时候必然有额外开销,
- 如果直接遍历判断,那么最终时间复杂度将会变成O(n2)
- 我用空间换时间
- 如果输入数据只有普通字符a~z,那么我们自建一个256 大小的hash表,用数组做容器
- 如果输入数据中海油汉字等其他字符,那么我们只能用Map集合了,或者用链表自实现Map,在上文 数据结构与算法–第一个只出现一次的字符 我们就是如此实现
- 如下动图:
- 如上分析有如下代码:
/*** 给定一个字符串,找出字符串中的最长子串,使得这个子串中没有重复的数字* @author liaojiamin* @Date:Created in 16:39 2021/7/15*/
public class FindLongestSubStr {public static void main(String[] args) {String maxSubStr = "1234578123";System.out.println(findLongestStr(maxSubStr));}/*** 双指针实现滑动窗口,并空间换时间* */public static Integer findLongestStr(String str){if(str == null || str.length() <= 0){return 0;}Map<Character, Integer> validateMap = new HashMap<>();char[] chars = str.toCharArray();int positionStart = 0;int positionEnd = 0;int maxSumLength = 0;while (positionEnd <= chars.length -1 && positionStart <= positionEnd){if(validateMap.containsKey(chars[positionEnd])){validateMap.remove(chars[positionStart]);positionStart++;}else {validateMap.put(chars[positionEnd], 1);positionEnd++;}int length = positionEnd-1 - positionStart +1;if(maxSumLength < length){maxSumLength = length;}}return maxSumLength;}}
上一篇:数据结构与算法–死磕二叉树
下一篇:数据结构与算法–二叉树第k个大的节点
数据结构与算法--再来聊聊数组相关推荐
- 新星计划Day4【数据结构与算法】 稀疏数组与队列
新星计划Day4[数据结构与算法] 稀疏数组与队列
- 尚硅谷01 数据结构与算法_数据结构与算法介绍+稀疏数组
数据结构与算法的关系 几个实际编程中遇到的问题 要想写出优秀的算法,首先应该能读懂别人写好的算法. 将生活中遇到的实际问题,使用程序来解决 线性结构和非线性结构 线性结构和非线性结构的关系: 数据结构 ...
- 菜鸟窝-数据结构与算法之稀疏数组
数据结构与算法 数据结构是组织(包括存储.处理等)数据的方式,是算法的基础 程序=数据结构+算法:数据结构分为线性和非线性 五子棋问题.约瑟夫问题等都离不开数据结构与算法 常用算法案例:修路问题.最短 ...
- 数据结构与算法 栈的数组实现
Java数据结构和算法 上一篇 主目录 下一篇 package stack;import java.util.Scanner;public class ArrayStackDemo {public s ...
- 数据结构与算法顺序表数组版
博主还在学校,写网络编程特别是后面的线程和多路I/O实在是太费精力,所以博主先把数据结构多跟新一点,也正好把学校的C语言数据结构的作业做了,正好一举两得 这个内容比较简单,就不再细说. #includ ...
- 数据结构与算法学习:数组
今天我们开始学习最基本,最简单的数据类型:数组:它是一种线性数据结构.具有一组连续的内存空间来存储相同数据类型的结构. 数据越界问题思考: 分析下面的代码,栈是由高到低位增长的,所以,i和数组的数据从 ...
- 数据结构与算法:动态数组(利用万能指针实现任意类型数组操作)
原理介绍 我们利用万能指针来实现动态数组,数组元素类型可以是任意类型,因为我们只维护用户提供的数据的地址,所以可以用万能指针来接受,这样就实现了类似C++中的模板功能了. 先说说动态数组和静态数组.静 ...
- 数据结构与算法:12 数组与稀疏矩阵
12 数组与稀疏矩阵 知识结构: 1. 数组 1.1 数组的定义 数组是具有一定顺序关系的若干对象组成的集合,组成数组的对象称为数组元素. 例如: 向量对应一维数组 A=(a0,a1,⋯,an−1)A ...
- 有序数组二分查找java_详解Java数据结构和算法(有序数组和二分查找)
一.概述 有序数组中常常用到二分查找,能提高查找的速度.今天,我们用顺序查找和二分查找实现数组的增删改查. 二.有序数组的优缺点 优点:查找速度比无序数组快多了 缺点:插入时要按排序方式把后面的数据进 ...
最新文章
- 整理了 65 个 Matplotlib 案例,这能不收藏?
- 使用SpringMVC创建支持向下兼容的版本化的API接口
- 解密个性化资讯推荐技术
- 商城项目实战2-登录模块的实现
- 软件项目管理0707:要对客户发自真心的好
- CCTMXTiledMap的使用
- flask 学习笔记 mvc ,sqlalchemy(insert,update)
- tgp饥荒服务器mod文件在哪,饥荒联机版中客户端mod文件夹在哪?注意不是服务器mod!...
- python递归函数讲解_带你深入学习Python——Python递归详解!
- 70. 爬楼梯 golang 斐波那契数列
- Python-接口开发入门
- 模块开发者使用 ES Modules 的正确姿势
- SpringBoot+拦截器+自定义异常+自定义注解+全局异常处理简单实现接口权限管理...
- pythontuple_python:tuple 真是鸡肋吗
- mysql 小类型_mysql数据类型
- MongoDB 安全与认证
- PHP爱好者:十天学会php之第一天
- springboot 集成J2Cache
- ideaIU-2017安装破解及汉化全包
- python安装face_recognition错误
热门文章
- linux之用echo输入数据到文本末尾以及用open ssl命令在证书文件里面获取公钥
- (六)python3 只需3小时带你轻松入门——循环
- 公司c语言面试题目,c语言面试最必考的十道试题,求职必看!!!
- 营业执照在线一键生成_如何在线制作证件照?证件照一键生成的方法
- python语法详解_解析 Python3 基础语法
- 潍坊学院计算机系崔玲玲,人工免疫算法在引水工程中的应用.pdf
- 被一帮小姐姐围着是什么感觉?
- 竟然能从一维空间变换为四维空间!?
- sas数据导入终极汇总-之二
- php 重定向到https,php – Laravel 5 – 重定向到HTTPS