当前位置: 首页 > news >正文

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)

相关文章:

LeetCode 热题 100 Day01

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

[vscode]vue js部分结尾加分号

设置中寻找 semicolons确定在TypeScript的这个扩展中设置选项为insert...

友点CMS image_upload.php 文件上传漏洞复现

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

C语言—指针(3)

嘿嘿嘿嘿&#xff0c;你看我像指针吗? 不会写&#xff0c;等我啥时候会写了再说吧&#xff0c;真的累了&#xff0c;倦了 1.面试题 1&#xff09;定义整形变量i&#xff1b; 2&#xff09;p为指向整形变量的指针变量&#xff1b; 3&#xff09;定…...

【八股文】面向对象基础

【八股文】面向对象基础 面向对象和面向过程的区别 面向过程把解决问题的过程拆成一个个方法&#xff0c;通过一个个方法的执行解决问题。面向对象会先抽象出对象&#xff0c;然后用对象执行方法的方式解决问题。 创建一个对象用什么运算符?对象实体与对象引用有何不同? …...

Day49 647 回文子串 516 最长回文子序列

647 回文子串 给定一个字符串&#xff0c;你的任务是计算这个字符串中有多少个回文子串。 具有不同开始位置或结束位置的子串&#xff0c;即使是由相同的字符组成&#xff0c;也会被视作不同的子串。 方法一&#xff1a;动态规划&#xff1a; 采用一个二维的dp数组&#xf…...

探秘GNU/Linux Shell:命令行的魔法世界

GNU/Linux的Shell是一种特殊的交互式工具&#xff0c;为用户提供了强大的控制和管理Linux系统的方式。在这个博客中&#xff0c;我们将深入了解Shell的基本概念、功能以及不同类型的Shell。 Shell的本质 Shell的核心是命令行提示符&#xff0c;它是用户与Linux系统进行交互的…...

基于STM32F407的coreJSON使用教程

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

keepalived双主模式测试

文章目录 环境准备部署安装keepavlived配置启动测试模拟Nginx宕机重新启动问题分析 环境准备 测试一下keepalived的双主模式&#xff0c;所谓双主模式就是两个keepavlied节点各持有一个/组虚IP&#xff0c;默认情况下&#xff0c;二者互为主备&#xff0c;同时对外提供服务&am…...

微服务中的熔断、降级和限流

在现代微服务架构中,熔断、降级和限流是保障系统稳定性和可靠性的重要手段。本文将深入探讨这三种机制在微服务架构中的作用、原理以及实践方法。 1. 熔断(Circuit Breaker) 1.1 作用和原理 熔断器是一种可以在服务发生故障时快速中断请求的机制,防止故障蔓延到整个系统…...

2023年便宜的云服务器分享:最低26元4核16G

2024年阿里云服务器租用价格表更新&#xff0c;云服务器ECS经济型e实例2核2G、3M固定带宽99元一年、ECS u1实例2核4G、5M固定带宽、80G ESSD Entry盘优惠价格199元一年&#xff0c;轻量应用服务器2核2G3M带宽轻量服务器一年61元、2核4G4M带宽轻量服务器一年165元12个月、2核4G服…...

汽车零部件制造业MES系统解决方案

一、​汽车零部件行业现状 随着全球汽车产业不断升级&#xff0c;汽车零部件市场竞争日趋激烈&#xff0c;从上游的钢铁、塑料、橡胶等生产到下游的主机厂配套制造&#xff0c;均已成为全球各国汽车制造大佬战略目标调整的焦点&#xff0c;其意欲在汽车零部件行业快速开疆扩土&…...

区块链/加密币/敏感/特殊题材专供外媒发稿,英文多国语言海外新闻营销推广

【本篇由言同数字科技有限公司原创】敏感题材是海外媒体在报道过程中常遇到的难题&#xff0c;需要平衡新闻真实性、公正性与敏感性。本文将探讨海外媒体报道敏感题材所面临的挑战&#xff0c;并介绍如何抓住机遇提高报道质量。 第一部分&#xff1a;敏感题材报道的挑战 报道…...

初识Nginx

摘要&#xff1a;最近几个项目中的接口总是访问受限&#xff0c;需要后端同事配置Nginx代理&#xff0c;了解下Nginx后面自己配置。 Nginx 是一款高性能的开源 Web 服务器和反向代理服务器。它具有轻量级、高并发、低内存消耗等特点&#xff0c;常被用作静态资源服务、负载…...

Rust语言之多线程

文章目录 一、简介二、创建线程1.创建一个线程2.创建多个线程生成随机数尝试让程序睡一会儿引入多线程 三、线程返回值的处理1.每个线程处理一个独立的值2.多个线程处理一个值Arc&#xff08;原子引用计数&#xff09;Mutex&#xff08;互斥锁&#xff09;RwLock&#xff08;读…...

现有的通用模型中融入少量中文数据没有太大意义少量的数据就能影响整个大模型

相关链接&#xff1a;只修改一个关键参数&#xff0c;就会毁了整个百亿参数大模型&#xff1f; | 新程序员-CSDN博客 现象 1&#xff1a;mBERT 模型的跨语言迁移 现象 2&#xff1a;大语言模型同样存在显著的语言对齐 现象 3&#xff1a;知识与语言分离 现象 4&#xff1a;…...

vscode 开发代码片段插件

环境准备 node - 20v版本 &#xff0c;推荐使用nvm进行版本控制全局安装 "yo" 是 Yeoman 工具的命令行工具&#xff0c; npm i yo -g全局安装 generator-code 是一个 Yeoman 脚手架 gernerator-code npm i gernerator-code -g全局安装 npm install -g vsce官方文档 …...

算法竞赛STL:array的使用方法

算法竞赛STL&#xff1a;array的使用方法 文章目录 算法竞赛STL&#xff1a;array的使用方法array array 容器描述&#xff1a; array是一种固定大小的容器&#xff0c;它包含指定数量的元素。每个元素都有一个非负整数索引&#xff0c;用于访问或修改它。 使用方法&#xff…...

MyBatis sql拦截器实现一个自动根据租户进行分表的方案

需求描述&#xff1a; 在一个多租户系统中&#xff0c;通过 MyBatis 实现动态数据表分离。具体来说&#xff0c;您希望通过 MyBatis 拦截器在执行 SQL 时自动将表名根据当前租户 ID (tenantId) 进行修改。这样&#xff0c;每个租户的数据就可以存储在专属于它们的表中&#xf…...

TiDB in 2023, 一次简单的回顾丨PingCAP 唐刘

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

【Linux】C语言执行shell指令

在C语言中执行Shell指令 在C语言中&#xff0c;有几种方法可以执行Shell指令&#xff1a; 1. 使用system()函数 这是最简单的方法&#xff0c;包含在stdlib.h头文件中&#xff1a; #include <stdlib.h>int main() {system("ls -l"); // 执行ls -l命令retu…...

Swift 协议扩展精进之路:解决 CoreData 托管实体子类的类型不匹配问题(下)

概述 在 Swift 开发语言中&#xff0c;各位秃头小码农们可以充分利用语法本身所带来的便利去劈荆斩棘。我们还可以恣意利用泛型、协议关联类型和协议扩展来进一步简化和优化我们复杂的代码需求。 不过&#xff0c;在涉及到多个子类派生于基类进行多态模拟的场景下&#xff0c;…...

相机从app启动流程

一、流程框架图 二、具体流程分析 1、得到cameralist和对应的静态信息 目录如下: 重点代码分析: 启动相机前,先要通过getCameraIdList获取camera的个数以及id,然后可以通过getCameraCharacteristics获取对应id camera的capabilities(静态信息)进行一些openCamera前的…...

论文浅尝 | 基于判别指令微调生成式大语言模型的知识图谱补全方法(ISWC2024)

笔记整理&#xff1a;刘治强&#xff0c;浙江大学硕士生&#xff0c;研究方向为知识图谱表示学习&#xff0c;大语言模型 论文链接&#xff1a;http://arxiv.org/abs/2407.16127 发表会议&#xff1a;ISWC 2024 1. 动机 传统的知识图谱补全&#xff08;KGC&#xff09;模型通过…...

css的定位(position)详解:相对定位 绝对定位 固定定位

在 CSS 中&#xff0c;元素的定位通过 position 属性控制&#xff0c;共有 5 种定位模式&#xff1a;static&#xff08;静态定位&#xff09;、relative&#xff08;相对定位&#xff09;、absolute&#xff08;绝对定位&#xff09;、fixed&#xff08;固定定位&#xff09;和…...

相机Camera日志分析之三十一:高通Camx HAL十种流程基础分析关键字汇总(后续持续更新中)

【关注我,后续持续新增专题博文,谢谢!!!】 上一篇我们讲了:有对最普通的场景进行各个日志注释讲解,但相机场景太多,日志差异也巨大。后面将展示各种场景下的日志。 通过notepad++打开场景下的日志,通过下列分类关键字搜索,即可清晰的分析不同场景的相机运行流程差异…...

MySQL中【正则表达式】用法

MySQL 中正则表达式通过 REGEXP 或 RLIKE 操作符实现&#xff08;两者等价&#xff09;&#xff0c;用于在 WHERE 子句中进行复杂的字符串模式匹配。以下是核心用法和示例&#xff1a; 一、基础语法 SELECT column_name FROM table_name WHERE column_name REGEXP pattern; …...

Selenium常用函数介绍

目录 一&#xff0c;元素定位 1.1 cssSeector 1.2 xpath 二&#xff0c;操作测试对象 三&#xff0c;窗口 3.1 案例 3.2 窗口切换 3.3 窗口大小 3.4 屏幕截图 3.5 关闭窗口 四&#xff0c;弹窗 五&#xff0c;等待 六&#xff0c;导航 七&#xff0c;文件上传 …...

CRMEB 中 PHP 短信扩展开发:涵盖一号通、阿里云、腾讯云、创蓝

目前已有一号通短信、阿里云短信、腾讯云短信扩展 扩展入口文件 文件目录 crmeb\services\sms\Sms.php 默认驱动类型为&#xff1a;一号通 namespace crmeb\services\sms;use crmeb\basic\BaseManager; use crmeb\services\AccessTokenServeService; use crmeb\services\sms\…...

Kubernetes 网络模型深度解析:Pod IP 与 Service 的负载均衡机制,Service到底是什么?

Pod IP 的本质与特性 Pod IP 的定位 纯端点地址&#xff1a;Pod IP 是分配给 Pod 网络命名空间的真实 IP 地址&#xff08;如 10.244.1.2&#xff09;无特殊名称&#xff1a;在 Kubernetes 中&#xff0c;它通常被称为 “Pod IP” 或 “容器 IP”生命周期&#xff1a;与 Pod …...