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 != ji != 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)

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/689037.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

【Spring】三级缓存

目录标题 触发所有未加载的实例a - 开始getBean&#xff08; doGetBean&#xff09; - 获取单例beangetSingleton() - 获取单例beancreateBean&#xff08;doCreateBean&#xff09; - 创建beancreateBeanInstance - 创建并返回beanaddSingletonFactory -放三级缓存populateBea…

序列发生器

一开始想直接FSM&#xff0c;划分出6状态依次输出对应的。但其实只要6比特的移位寄存器&#xff0c;每次输出高位。复位后的默认值时6’b001_011。这样就可以实现循环&#xff0c;这种移位寄存器也叫barrel_shifter。循环移位。也可以使用循环计数器&#xff0c;然后case计数器…

<爬虫Error篇>:乱码问题

前言: 当涉及到网页编码问题时&#xff0c;经常会遇到不同页面使用不同编码方式的情况。这可能导致在解析页面时出现乱码&#xff0c;使我们无法正确获取页面内容 正文: 网页的编码问题: 在处理网页编码问题之前&#xff0c;我们需要了解一些基础知识。网页中的编码方式通常…

JRT监听-PDF-Excel-Img

依赖全新设计&#xff0c;我们无需再顾虑历史兼容性的束缚&#xff1b;同时&#xff0c;基于多年来累积的深入需求理解&#xff0c;JRT监听机制巧妙地借助CMD命令模式&#xff0c;达成了监听的全面统一。无论是PDF、Excel还是图片文件&#xff0c;都不再需要特殊对待或额外区分…

MT8781核心板_MTK8781安卓核心板规格参数

MT8781安卓核心板以其强大的性能和高效的能耐备受瞩目。其八核CPU架构包括(2x Cortex-A76 2.2GHz 6x Cortex-A55 2.0GHz)&#xff0c;以及高性能的Arm Mali G57级GPU。同时&#xff0c;配备高达2,133MHz的LPDDR4X内存和快速的UFS 2.2级存储&#xff0c;大大加速了数据访问速…

java面试集合篇

上面是java中集合的整体框架图。 集合使用的数据结构 算法复杂度分析 时间复杂度分析 时间复杂度分析&#xff1a;来评估代码的执行耗时的 /*** 求1~n的累加和* param n* return*/ public int sum(int n) {int sum 0;for ( int i 1; i < n; i) {sum sum i;}return …

ubuntu22.04-磁盘管理-虚拟机动态扩容-系统monitor

文章目录 1.虚拟机2.ubuntu设置3.命令查看4.系统资源管理器 1.虚拟机 关闭ubuntu22.04&#xff0c;然后修改虚拟机设置&#xff0c;如下图所示&#xff1a; 修改容量 2.ubuntu设置 搜索打开disks&#xff0c;如下图所示&#xff1a; 选择目标磁盘&#xff0c;选择调整大小…

Filterajax

1.Filter概念 概念:表示过滤器,是JavaWeb三大组件(Servlet,Filter,Listener)之一;过滤器可以把对资源的请求拦截下来,从而实现一些特殊的功能.过滤器可以完成一些通用操作比如:登录添加购物车,视频广告,敏感字符处理等等... 2.Filter快速入门 3.Listener 4.Ajax学习 1.使用场…

Android 15 第一个开发者预览版

点击查看&#xff1a;first-developer-preview-android15 点击查看&#xff1a;Get Android 15 2024年2月16日,谷歌发布 Android 15 第一个开发者预览版 翻译 由工程副总裁戴夫伯克发布 今天&#xff0c;我们发布了Android 15的首个开发者预览版&#xff0c;这样我们的开发者就…

腾讯云OSS文件上传功能

腾讯云COS介绍 腾讯云COS&#xff08;Cloud Object Storage&#xff09;是一种基于对象的存储服务&#xff0c;用于存储和管理海量的非结构化数据&#xff0c;如图片、音视频文件、备份数据等。它具有以下特点和优势&#xff1a; 高可靠性&#xff1a;采用分布式存储架构&…

MySQL学习记录——십이 事务

文章目录 1、了解事务2、事务提交3、事务隔离级别1、隔离性和隔离级别2、查看、设置隔离级别3、读未提交4、读提交5、可重复读6、串行化7、总结 4、事务一致性5、事务隔离性1、隐藏字段2、undo日志3、模拟MVCC4、Read View 6、读提交RC、可重复读RR的区别 1、了解事务 MySQL内…

强化学习(TD3)

TD3——Twin Delayed Deep Deterministic policy gradient 双延迟深度确定性策略梯度 TD3是DDPG的一个优化版本&#xff0c;旨在解决DDPG算法的高估问题 优化点&#xff1a; ①双重收集&#xff1a;采取两套critic收集&#xff0c;计算两者中较小的值&#xff0c;从而克制收…

第一个 Angular 项目 - 动态页面

第一个 Angular 项目 - 动态页面 使用的所有技巧都在下面的笔记里&#xff1a; [Angular 基础] - 数据绑定(databinding) [Angular 基础] - 指令(directives) 以上为静态页面&#xff0c;即不涉及到跨组件交流的内容 以下涉及到组件内的沟通&#xff0c;从这开始数据就“活”…

才气系统与逻辑系统道装实现的比较

才气系统与逻辑系统道装实现的比较 道装道装思想简介烛火流形学习引擎&#xff0c;流形学习的引入王船山信息熵&#xff0c;简称王船山熵&#xff1b;凝聚态数学可计算函数科学方法道装由来琴语言简介逻辑与才气的逐层比较表格&#xff08;王船山熵&#xff09; 道装 道装思想…

OpenCV 入门讲解

OpenCV 入门讲解 OpenCV&#xff08;Open Source Computer Vision Library&#xff09; 是一个开源的计算机视觉库&#xff0c;它提供了许多高效实现计算机视觉算法的函数&#xff0c;从基本的滤波到高级的物体检测都有涵盖。OpenCV 使用 C/C 开发&#xff0c;同时也提供了 Pyt…

短链接系统测试报告

目录 项目背景 项目功能 自动化测试 总结 项目背景 随着互联网的发展&#xff0c;链接&#xff08;URL&#xff09;变得越来越长且复杂&#xff0c;这不仅影响用户体验&#xff0c;还可能由于字符限制导致在某些平台或应用中无法完整显示。为了解决这一问题&#xff0c;我…

Ubuntu22.04LTS编译Frida历史版本,环境配制及细节调整

经常使用Frida的朋友们可能会遇到Frida的各种问题需要自定义的&#xff0c;而这时候Frida的本地编译就显得很重要了。 最近一位朋友发现使用Frida14/15/16版的server只能连拉一定数量的设备&#xff0c;超过了frida-device-manager便不能连接设备。 实现没有办法&#xff0c;…

综合练习

目录 查询每个员工的编号、姓名、职位、基本工资、部门名称、部门位置 确定要使用的数据表 确定已知的关联字段 查询每个员工的编号、姓名、职位、基本工资、工资等级 确定要使用的数据表 确定已知的关联字段 查询每个员工的编号、姓名、职位、基本工资、部门名称、工资…

⭐北邮复试刷题589. N 叉树的前序遍历__DFS (力扣每日一题)

589. N 叉树的前序遍历 给定一个 n 叉树的根节点 root &#xff0c;返回 其节点值的 前序遍历 。 n 叉树 在输入中按层序遍历进行序列化表示&#xff0c;每组子节点由空值 null 分隔&#xff08;请参见示例&#xff09;。 示例 1&#xff1a; 输入&#xff1a;root [1,null,…

数据安全之认识数据资产管理平台

文章目录 一、什么是数据资产二、什么是数据资产管理平台1、什么是数据资产管理平台2、为什么需要数据资产管理平台 三、数据资产管理平台的主要功能四、数据资产管理平台的工作原理五、数据资产管理平台的应用场景六、安全资产管理平台与数据资产管理平台的区别与关系1、安全资…