LeetCode 热题 100 Day01
哈希模块
哈希结构:
哈希结构,即hash table,哈希表|散列表结构。
图摘自《代码随想录》
哈希表本质上表示的元素和索引的一种映射关系。
若查找某个数组中第n个元素,有两种方法:
1.从头遍历,复杂度:O(n)
2.使用数组这种hash结构,根据下标(索引)来查找,复杂度:O(1)
实现了快速判断元素是否出现在集合里。
哈希函数:
哈希函数指:根据映射关系,构造hash表的方法
哈希碰撞: 当根据映射方法进行映射,构造hash表时,出现两个元素抢占一个索引的现象,叫做hash碰撞。
如:hash函数 index=(value%3)
则0和3所得索引都是0,抢占同一索引0,发生hash碰撞。
解决hash碰撞的两个方法:拉链法和线性探测:
拉链法:将冲突的元素串成链表,放在被抢占的索引处。
线性探测:将一个元素放入该索引,顺找该索引往下找一个空位置,存放另一个元素。
Leetcode 1. 两数之和
题意理解:
给定一个整数数组
nums
和一个整数目标值target
,请你在该数组中找出 和为目标值target
的那 两个 整数,并返回它们的数组下标。你可以假设每种输入只会对应一个答案。但是,数组中同一个元素在答案里不能重复出现。你可以按任意顺序返回答案。
给定一个数组,和一个目标值target, 求数组中两个数和为target, 这两个数的下标。
解题思路:
采用hash结构来解题,目的是快速找到某个值
哈希法解题:
public int[] twoSum(int[] nums, int target) {Map<Integer,Integer> numsMap=new HashMap<>();for(int i=0;i<nums.length;i++){if(!numsMap.isEmpty()&&numsMap.keySet().contains(nums[i])){return new int[]{i,numsMap.get(nums[i])};}numsMap.put(target-nums[i],i);}return null;}
复杂度分析:
时间复杂度:O(n), 遍历数组的开销
空间复杂度:O(n), hash表的开销
Leetcode 49. 字母异位词分组
题意理解:
给你一个字符串数组,请你将 字母异位词 组合在一起。可以按任意顺序返回结果列表。字母异位词 是由重新排列源单词的所有字母得到的一个新单词。
字母异位词本质上是元素一样的数组。
则所有异位字符串,通过字母按从小到大的顺序重排,得到的值是一样的。我们将其作为索引,对应字母异位词,本质上是哈希表的拉链法。
解题思路:
将异位字符串,通过字母按从小到大的顺序重排,得到的值作为index
通过map进行收集index和以为字符串的映射关系。
主要是依赖了哈希结构:index和value的对应关系。
哈希解题:
public List<List<String>> groupAnagrams(String[] strs) {Map<String, ArrayList<String>> map=new HashMap<>();for(int i=0;i< strs.length;i++){String index=recombination(strs[i]);if(map.containsKey(index)){map.get(index).add(strs[i]);}else {ArrayList<String> newList=new ArrayList<>();newList.add(strs[i]);map.put(index,newList);}}return new ArrayList<>(map.values());}public String recombination(String str){char[] strArr=str.toCharArray();Arrays.sort(strArr);return String.valueOf(strArr);}
复杂度分析:
时间复杂度:O(nklogk), 遍历元素的时间n,每个元素排序的世家klogk
空间复杂度:O(nk), 字符数组的大小
n是元素个数,k是字符串字母个数
Leetcode 128. 最长连续序列
题意理解:
给定一个未排序的整数数组
nums
,找出数字连续的最长序列(不要求序列元素在原数组中连续)的长度。请你设计并实现时间复杂度为O(n)
的算法解决此问题。即使用nums中的元素,排序的话,能够连续的最长序列是多少呢。
这里的要求是时间复杂度O(n)
尝试使用hash的方法来解题。
解题思路:
hash解题的主要问题是:如何构造索引和值的映射。
这里:我们将最长序列的长度作为值。而index为当前元素。
(1)首先对数组进行重。set
(2) 在set中找一个序列的下界
nums[i] 且set不包含nums[i]-1
` (3) 遍历长度。length++
(4)用result记录最长的长度
哈希解题:
public int longestConsecutive(int[] nums) {int result=0;Set<Integer> set = new HashSet<>();for(int i=0;i< nums.length;i++) set.add(nums[i]);for(int num:set){if(!set.contains(num-1)){int length=0;while(set.contains(num)){length++;num++;}result=Math.max(result,length);}}return result;}
复杂度分析:
时间复杂度:O(n)所有元素仅遍历一遍
空间复杂度:O(n),set的空间损耗
双指针模块
双指针:
在遍历一个数组遍历过程中定义两个指针,可以表示为:快指针和慢指针、或左指针和右指针。
双指针法(快慢指针法)在数组和链表的操作中是非常常见的,很多考察数组、链表、字符串等操作的面试题,都使用双指针法。
摘自:《代码随想录》
Leetcode 283. 移动零
题意理解:
给定一个数组
nums
,编写一个函数将所有0
移动到数组的末尾,同时保持非零元素的相对顺序。请注意 ,必须在不复制数组的情况下原地对数组进行操作。这道题目要求在不复制数组的情况下原地操作,使所有的0移到数组末尾。
这里采用双指针来解决这道题目
解题思路:
这里使用两个指针:慢指针i用于寻找元素0;快指针用于寻找0后的第一个非0元素
不断将非零元素和零元素进行互换,将0元素全部移至数组末尾
特别的:对于j的约束: j要小于等于nums.length,若j后续没有找到合适的非0元素,则结束,不操作。
双指针解题:
public void moveZeroes(int[] nums) {for(int i=0;i<nums.length;i++){if(nums[i]==0){//找到0元素时//查找后续非0元素,j的指示int j=i;while(j<nums.length&&nums[j]==0) j++;//找到后续非0元素,互换if(j< nums.length){int temp=nums[i];nums[i]=nums[j];nums[j]=temp;}else{//末尾无非0元素。i=nums.length;}}}}
复杂度分析:
时间复杂度:O(n) , 所有元素遍历一遍的时间复杂度
空间复杂度:O(1) ,在原数组操作,仅有temp的空间消耗,所以是O(1)
Leetcode 11. 盛最多水的容器
题意理解:
给定一个长度为
n
的整数数组height
。有n
条垂线,第i
条线的两个端点是(i, 0)
和(i, height[i])
。找出其中的两条线,使得它们与
x
轴共同构成的容器可以容纳最多的水。返回容器可以储存的最大水量。
这道题目要求求容器可以存储的最大水量,储水量=h*w
其中使用双指针来i指示左边界,j指示右边界。
h=min(height[i],height[j])
w=j-i
解题思路:
选中一个左边界,一个右边界,计算S
保留尽可能高的边界,以备更多的储水量,所以,对于两个边界中较矮的边界进行移动,以期待获取一个比当前边界更大的边界。
初始化:i=0,j=nums[len-1]
计算S
当height[i]<height[j]时:i++;
否则j--,始终保持i<j
计算所有可能的S,使用maxS返回最大储水量。
双指针解题:
public int maxArea(int[] height) {int i=0,j=height.length-1,maxS=0;while(i<j){int S=Math.min(height[i],height[j])*(j-i);maxS=Math.max(maxS,S);if(height[i]<=height[j]){i++;}else{j--;}}return maxS;}
复杂度分析:
时间复杂度:O(n), 所有元素遍历一遍的时间损耗
空间复杂度:O(1),maxS的空间损耗
Leetcode 15. 三数之和
题意理解:
给你一个整数数组
nums
,判断是否存在三元组[nums[i], nums[j], nums[k]]
满足i != j
、i != k
且j != k
,同时还满足nums[i] + nums[j] + nums[k] == 0
。请你返回所有和为
0
且不重复的三元组。注意:答案中不可以包含重复的三元组。
数组中取三个数使其和==0,每个元素每次只能去一次,可以有多少种组合。
这里求的是组合数,与顺序无关。
我们采用双指针方式来解题。
解题思路:
首先对数组进行排序。
其中我们选中一个元素nums[i]
以i+1为左边界left,len-1为右边界right, 查找符合规范的二元组,找到则加入结果集。
特别的,对于去重操作:
已知数组有序,且i确定的情况下,nums[left]不取重,left++; nums[right]不取重,right++
对于nums[i]==nums[i+1]的情况下,nums[i]已经包含了nums[i+1]的方式,所以,nums[i+1]时,continue
1.双指针解题
public List<List<Integer>> threeSum(int[] nums) {Arrays.sort(nums);List<List<Integer>> result=new ArrayList<>();for(int i=0;i< nums.length-1;i++){if(i>0&&nums[i]==nums[i-1]) continue;int left=i+1;int right= nums.length-1;while(left<right){if(nums[i]+nums[left]+nums[right]>0) right--;else if (nums[i]+nums[left]+nums[right]<0) left++;else {//去重result.add(Arrays.asList(nums[i],nums[left],nums[right]));while(left<right&&nums[left+1]==nums[left]) left++;while(left<right&&nums[right-1]==nums[right]) right--;left++;right--;}}}return result;}
2.复杂度分析
时间复杂度:O(n^2),遍历i的时间损耗*双指针操作时间损耗
空间复杂度:O(n), 结果集存储元素的损耗
Leetcode 42. 接雨水
题意理解:
给定
n
个非负整数表示每个宽度为1
的柱子的高度图,计算按此排列的柱子,下雨之后能接多少雨水。
给定一个柱子的高度数组,求这些柱子组成的形状中,能积的水的量。
每个积水量的涉及S=w*h
其中左边界left,右边界right, 则w=right-left-1
h=max(height[left],height[right])
我们尝试使用双指针的方式解题。
解题思路:
选中一个柱子作为左边界,右边界为该柱子后第一个比它大的值,底初始化为该柱子后第一个比它小的值。
则左边界一定满足:height[i]>height[i+1]
注意:特别的:如4、2、3左边界高4时,右边没有比4高的柱子,则选择右边最高的柱子作为右边界。
1.双指针解题
public int trap(int[] height) {int S=0;for(int i=0;i<height.length-1;i++){int bottom=i+1;if(height[i]>height[bottom]){//找左边界:只有一高一低,才有可能存在储水左边界int j=i+1;int right=j;//右边最大的值while(j<height.length){//找储水有边界,有两种情况: // 左边第一个比左边界大的柱子// 或右边最大的柱子(右边没有比左边大的柱子)//右边最大值if(height[j]>=height[right]){right=j;}//右边第一个比它大的值if(height[j]>=height[i]){right=j;break;}j++;}//要使积水,则右边界和左边界之间最少有一个位置的空隙,保证j合法if(right<height.length&&j-i>1){//有左右边界及底//纵向计算该范围内的储水量while(bottom<right){S+=(Math.min(height[i],height[right])-height[bottom])*1;//一个单位一个单位蓄水量累加bottom++;}i=right-1;}}}return S;}
2.复杂度分析
时间复杂度:O(n^2)
空间复杂度:O(1)
相关文章:

LeetCode 热题 100 Day01
哈希模块 哈希结构: 哈希结构,即hash table,哈希表|散列表结构。 图摘自《代码随想录》 哈希表本质上表示的元素和索引的一种映射关系。 若查找某个数组中第n个元素,有两种方法: 1.从头遍历,复杂度…...

[vscode]vue js部分结尾加分号
设置中寻找 semicolons确定在TypeScript的这个扩展中设置选项为insert...

友点CMS image_upload.php 文件上传漏洞复现
0x01 产品简介 友点CMS是一款高效且灵活的网站管理系统,它为用户提供了简单易用的界面和丰富的功能。无论是企业还是个人,都能通过友点CMS快速搭建出专业且美观的网站。该系统支持多种内容类型和自定义模板,方便用户按需调整。同时,它具备强大的SEO功能,能提升网站在搜索…...

C语言—指针(3)
嘿嘿嘿嘿,你看我像指针吗? 不会写,等我啥时候会写了再说吧,真的累了,倦了 1.面试题 1)定义整形变量i; 2)p为指向整形变量的指针变量; 3)定…...

【八股文】面向对象基础
【八股文】面向对象基础 面向对象和面向过程的区别 面向过程把解决问题的过程拆成一个个方法,通过一个个方法的执行解决问题。面向对象会先抽象出对象,然后用对象执行方法的方式解决问题。 创建一个对象用什么运算符?对象实体与对象引用有何不同? …...
Day49 647 回文子串 516 最长回文子序列
647 回文子串 给定一个字符串,你的任务是计算这个字符串中有多少个回文子串。 具有不同开始位置或结束位置的子串,即使是由相同的字符组成,也会被视作不同的子串。 方法一:动态规划: 采用一个二维的dp数组…...
探秘GNU/Linux Shell:命令行的魔法世界
GNU/Linux的Shell是一种特殊的交互式工具,为用户提供了强大的控制和管理Linux系统的方式。在这个博客中,我们将深入了解Shell的基本概念、功能以及不同类型的Shell。 Shell的本质 Shell的核心是命令行提示符,它是用户与Linux系统进行交互的…...

基于STM32F407的coreJSON使用教程
目录 概述 工程建立 代码集成 函数介绍 使用示例 概述 coreJSON是FreeRTOS中的一个组件库,支持key查找的解析器,他只是一个解析器,不能生成json数据。同时严格执行 ECMA-404 JSON 标准。该库用 C 语言编写,设计符合 ISO C90…...

keepalived双主模式测试
文章目录 环境准备部署安装keepavlived配置启动测试模拟Nginx宕机重新启动问题分析 环境准备 测试一下keepalived的双主模式,所谓双主模式就是两个keepavlied节点各持有一个/组虚IP,默认情况下,二者互为主备,同时对外提供服务&am…...
微服务中的熔断、降级和限流
在现代微服务架构中,熔断、降级和限流是保障系统稳定性和可靠性的重要手段。本文将深入探讨这三种机制在微服务架构中的作用、原理以及实践方法。 1. 熔断(Circuit Breaker) 1.1 作用和原理 熔断器是一种可以在服务发生故障时快速中断请求的机制,防止故障蔓延到整个系统…...

2023年便宜的云服务器分享:最低26元4核16G
2024年阿里云服务器租用价格表更新,云服务器ECS经济型e实例2核2G、3M固定带宽99元一年、ECS u1实例2核4G、5M固定带宽、80G ESSD Entry盘优惠价格199元一年,轻量应用服务器2核2G3M带宽轻量服务器一年61元、2核4G4M带宽轻量服务器一年165元12个月、2核4G服…...

汽车零部件制造业MES系统解决方案
一、汽车零部件行业现状 随着全球汽车产业不断升级,汽车零部件市场竞争日趋激烈,从上游的钢铁、塑料、橡胶等生产到下游的主机厂配套制造,均已成为全球各国汽车制造大佬战略目标调整的焦点,其意欲在汽车零部件行业快速开疆扩土&…...
区块链/加密币/敏感/特殊题材专供外媒发稿,英文多国语言海外新闻营销推广
【本篇由言同数字科技有限公司原创】敏感题材是海外媒体在报道过程中常遇到的难题,需要平衡新闻真实性、公正性与敏感性。本文将探讨海外媒体报道敏感题材所面临的挑战,并介绍如何抓住机遇提高报道质量。 第一部分:敏感题材报道的挑战 报道…...
初识Nginx
摘要:最近几个项目中的接口总是访问受限,需要后端同事配置Nginx代理,了解下Nginx后面自己配置。 Nginx 是一款高性能的开源 Web 服务器和反向代理服务器。它具有轻量级、高并发、低内存消耗等特点,常被用作静态资源服务、负载…...
Rust语言之多线程
文章目录 一、简介二、创建线程1.创建一个线程2.创建多个线程生成随机数尝试让程序睡一会儿引入多线程 三、线程返回值的处理1.每个线程处理一个独立的值2.多个线程处理一个值Arc(原子引用计数)Mutex(互斥锁)RwLock(读…...
现有的通用模型中融入少量中文数据没有太大意义少量的数据就能影响整个大模型
相关链接:只修改一个关键参数,就会毁了整个百亿参数大模型? | 新程序员-CSDN博客 现象 1:mBERT 模型的跨语言迁移 现象 2:大语言模型同样存在显著的语言对齐 现象 3:知识与语言分离 现象 4:…...

vscode 开发代码片段插件
环境准备 node - 20v版本 ,推荐使用nvm进行版本控制全局安装 "yo" 是 Yeoman 工具的命令行工具, npm i yo -g全局安装 generator-code 是一个 Yeoman 脚手架 gernerator-code npm i gernerator-code -g全局安装 npm install -g vsce官方文档 …...
算法竞赛STL:array的使用方法
算法竞赛STL:array的使用方法 文章目录 算法竞赛STL:array的使用方法array array 容器描述: array是一种固定大小的容器,它包含指定数量的元素。每个元素都有一个非负整数索引,用于访问或修改它。 使用方法ÿ…...
MyBatis sql拦截器实现一个自动根据租户进行分表的方案
需求描述: 在一个多租户系统中,通过 MyBatis 实现动态数据表分离。具体来说,您希望通过 MyBatis 拦截器在执行 SQL 时自动将表名根据当前租户 ID (tenantId) 进行修改。这样,每个租户的数据就可以存储在专属于它们的表中…...

TiDB in 2023, 一次简单的回顾丨PingCAP 唐刘
2023 年已经过去,TiDB 经过了一年的迭代,又往前进步了一点点,我们非常自豪的看到,TiDB 正在不断地帮助我们的客户成功,包括但不限于: ○ 首个云原生、分布式、全栈国产化银行核心业务系统投产上线丨TiDB …...

Vue3 + Element Plus + TypeScript中el-transfer穿梭框组件使用详解及示例
使用详解 Element Plus 的 el-transfer 组件是一个强大的穿梭框组件,常用于在两个集合之间进行数据转移,如权限分配、数据选择等场景。下面我将详细介绍其用法并提供一个完整示例。 核心特性与用法 基本属性 v-model:绑定右侧列表的值&…...

3.3.1_1 检错编码(奇偶校验码)
从这节课开始,我们会探讨数据链路层的差错控制功能,差错控制功能的主要目标是要发现并且解决一个帧内部的位错误,我们需要使用特殊的编码技术去发现帧内部的位错误,当我们发现位错误之后,通常来说有两种解决方案。第一…...

tree 树组件大数据卡顿问题优化
问题背景 项目中有用到树组件用来做文件目录,但是由于这个树组件的节点越来越多,导致页面在滚动这个树组件的时候浏览器就很容易卡死。这种问题基本上都是因为dom节点太多,导致的浏览器卡顿,这里很明显就需要用到虚拟列表的技术&…...

【JVM】Java虚拟机(二)——垃圾回收
目录 一、如何判断对象可以回收 (一)引用计数法 (二)可达性分析算法 二、垃圾回收算法 (一)标记清除 (二)标记整理 (三)复制 (四ÿ…...

Proxmox Mail Gateway安装指南:从零开始配置高效邮件过滤系统
💝💝💝欢迎莅临我的博客,很高兴能够在这里和您见面!希望您在这里可以感受到一份轻松愉快的氛围,不仅可以获得有趣的内容和知识,也可以畅所欲言、分享您的想法和见解。 推荐:「storms…...

手机平板能效生态设计指令EU 2023/1670标准解读
手机平板能效生态设计指令EU 2023/1670标准解读 以下是针对欧盟《手机和平板电脑生态设计法规》(EU) 2023/1670 的核心解读,综合法规核心要求、最新修正及企业合规要点: 一、法规背景与目标 生效与强制时间 发布于2023年8月31日(OJ公报&…...

Vue ③-生命周期 || 脚手架
生命周期 思考:什么时候可以发送初始化渲染请求?(越早越好) 什么时候可以开始操作dom?(至少dom得渲染出来) Vue生命周期: 一个Vue实例从 创建 到 销毁 的整个过程。 生命周期四个…...

自然语言处理——文本分类
文本分类 传统机器学习方法文本表示向量空间模型 特征选择文档频率互信息信息增益(IG) 分类器设计贝叶斯理论:线性判别函数 文本分类性能评估P-R曲线ROC曲线 将文本文档或句子分类为预定义的类或类别, 有单标签多类别文本分类和多…...
绕过 Xcode?使用 Appuploader和主流工具实现 iOS 上架自动化
iOS 应用的发布流程一直是开发链路中最“苹果味”的环节:强依赖 Xcode、必须使用 macOS、各种证书和描述文件配置……对很多跨平台开发者来说,这一套流程并不友好。 特别是当你的项目主要在 Windows 或 Linux 下开发(例如 Flutter、React Na…...
算法刷题-回溯
今天给大家分享的还是一道关于dfs回溯的问题,对于这类问题大家还是要多刷和总结,总体难度还是偏大。 对于回溯问题有几个关键点: 1.首先对于这类回溯可以节点可以随机选择的问题,要做mian函数中循环调用dfs(i&#x…...