【LeetCode算法题】数组经典题目分析

系列文章目录

【LeetCode算法题】各类基础排序算法的Python实现
【LeetCode算法题】数组经典题目分析


文章目录

  • 系列文章目录
  • 前言
  • 一、二分查找(704)
  • 二、移除元素(27)
  • 三、有序数组的平方(977)
  • 四、长度最小的子数组(209)
  • 五、螺旋矩阵(59)
  • 总结


前言

  本文对LeetCode中的数组类的经典题目进行分析,题目序号分别为 704.二分查找27.移除元素977.有序数组的平方209.长度最小的子数组59.螺旋矩阵ll


一、二分查找(704)

  Q:给定一个 n 个元素有序的(升序)整型数组 nums 和一个目标值 target ,写一个函数搜索 nums 中的 target,如果目标值存在返回下标,否则返回 -1。
  分析:有序数组查询特定值,一般的折半查找思路。

class Solution(object):def search(self, nums, target):""":type nums: List[int]:type target: int:rtype: int"""low = 0;high = (len(nums) - 1);while (low <= high):mid = (low + high) // 2;if (nums[mid] == target): return mid;if (nums[mid] < target):low = mid + 1;if (nums[mid] > target):high = mid - 1;return -1;

二、移除元素(27)

  Q:给你一个数组 nums 和一个值 val,你需要 原地 移除所有数值等于 val 的元素,并返回移除后数组的新长度。
注:不要使用额外的数组空间,你必须仅使用 O(1) 额外空间并原地修改输入数组。
  分析:利用快慢指针的思维,当 fast 所指的值等于 val,仅向后移动 fast ,当 fast 所指的值不等于 val 时 fast 与 slow 均向前移动一位,且将 fast 所指的值赋给 slow 所指的地址。

class Solution(object):def removeElement(self, nums, val):""":type nums: List[int]:type val: int:rtype: int"""slow = 0;fast = 0;while (fast < len(nums)):if (nums[fast] != val):nums[slow] = nums[fast];slow += 1;fast += 1;return slow;

三、有序数组的平方(977)

  Q:给你一个按 非递减顺序 排序的整数数组 nums,返回 每个数字的平方 组成的新数组,要求也按 非递减顺序 排序。
注:初始整数数组存在负数
  分析:基本思路是先将数组元素平方,然后再对数组进行排序,这里的排序可以用各种排序算法,参考:【LeetCode算法题】各类基础排序算法的Python实现。但该思路一般会导致时间超时,可以采用双指针思维,创建一个空数组,仅在数组两头才可能取最大值,建立左右指针 left 与 right,将大的添加到空数组头,并将对应指针向里移一单位,直到指针重合。

class Solution(object):def sortedSquares(self, nums):""":type nums: List[int]:rtype: List[int]"""low = 0;high = len(nums) - 1;nums_ = [];while (low <= high):if (nums[low]**2 <= nums[high]**2):nums_.insert(0, nums[high] ** 2);high = high - 1;else:nums_.insert(0, nums[low] ** 2);low = low + 1;return nums_;

四、长度最小的子数组(209)

  Q:给定一个含有 n 个正整数的数组和一个正整数 s ,找出该数组中满足其和 ≥ s 的长度最小的 连续 子数组,并返回其长度。如果不存在符合条件的子数组,返回 0。
  分析:基本思路是用两层 for 循环将所有可能的子数组遍历,找到满足条件的最小长度,该方式时间复杂度较高,改进思路是减少循环次数,双循环是同时限制了子数组的起止,单循环仅限制子数组的止。核心思路是:创建两个指针start,end,初始两指针均在数组头,之后推进 end 指针,当出现 sum(array[start, end]) > val 时,停止end后移,开始后移 start,直到达到最小满足条件的范围,并记录,之后继续后移 end ;循环操作,并每次取最小的范围,直至 end 达到数组尾。

class Solution(object):def minSubArrayLen(self, target, nums):""":type target: int:type nums: List[int]:rtype: int"""i = 0;n = len(nums);min_ = n + 1;total = 0;for j in range(n):   	# 不直接使用sum(数组切片),可以加快速度.total += nums[j];while (total >= target):min_ = min(min_, j - i + 1);total -= nums[i];i += 1;return 0 if min_ == n + 1 else min_;

五、螺旋矩阵(59)

  Q:给定一个正整数 n,生成一个包含 1 到 n^2 所有元素,且元素按顺时针顺序螺旋排列的正方形矩阵。
  分析:这个题目的思路非常巧妙,创建一个空的二维数组,限制数组矩阵四边的起始位置,按照顺时针依次填入数据。

class Solution(object):def generateMatrix(self, n):""":type n: int:rtype: List[List[int]]"""mat = [[0 for i in range(n)] for i in range (n)]w, s, a, d, m = 1, n, 1, n, 0;len_ = n**2;while(m < len_):j_a = a - 1;while(j_a < d):mat[w - 1][j_a] = m + 1;m += 1;j_a += 1;w = w + 1;j_w = w - 1;while (j_w < s):mat[j_w][d - 1] = m + 1;m += 1;j_w += 1;d = d - 1;j_s = d ;while(j_s >= a):mat[s - 1][j_s - 1] = m + 1;m += 1;j_s -= 1;s = s - 1;j_a = s ;while (j_a >= w):mat[j_a - 1][a - 1] = m + 1;m += 1;j_a -= 1;a = a + 1;return mat              

总结

  数组除了较为经典的查找、排序算法外,比较常用的思想还有:以空间换时间双指针等。

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

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

相关文章

Intel Quartus II IP之DP1.4 工程的创建与使用

前述&#xff1a; Win10电脑安装了Quartus 21.4&#xff0c;这可以满足绝大多数情况&#xff0c;但是对于创建DMI/DP IP的设计demo工程时会报错&#xff0c;因为还需要Eclipse与WSL&#xff08;Windows Subsystem for Linux&#xff09;。 具体安装方法参考&#xff1a; Int…

Redis与DB数据一致性-个人总结

缓存读写策略: Cache-Aside Pattern 读缓存: 先查询缓存&#xff0c;存在则返回, 如果不存在则查询DB, 再塞回缓存中,最后返回结果. 写缓存: 更新完成DB之后&#xff0c;删除缓存. 适合场景: 读比较多的场景&#xff0c;更新比较少的场景. 像我们工作当中&#…

R语言【paleobioDB】——pbdb_strata_auto():通过部分名称或前缀返回多个地质地层的基本信息

Package paleobioDB version 0.7.0 paleobioDB 包在2020年已经停止更新&#xff0c;该包依赖PBDB v1 API。 可以选择在Index of /src/contrib/Archive/paleobioDB (r-project.org)下载安装包后&#xff0c;执行本地安装。 Usage pbdb_strata_auto (...) Arguments 参数【...…

redis7部署集群:包含主从模式、哨兵模式、Cluster集群模式等三种模式

前言&#xff1a; redis部署集群常见的一般有三种模式&#xff1a;主从模式&#xff0c;Sentinel&#xff08;哨兵模式&#xff09;&#xff0c;Redis Cluster&#xff08;高可用Cluster集群&#xff09;&#xff0c;根据不同的需求可自定义选择部署方式。 Redis 主从模式&…

c# 视频播放之Vlc.DotNet.Forms

先说下优缺点 优点&#xff1a;与电脑无关&#xff0c;能播放主流编码格式视频。 缺点&#xff1a;只能播放本地视频&#xff0c;网络视频播放不了。 下面是具体操作和代码 1. 安装Vlc.DotNet.Forms 和 VideoLAN.LibVLC.Windows Vlc.DotNet.Forms 是播放库&#xff0c;Vid…

C语言所有字符串函数举例如何使用

strcpy: 将一个字符串复制到另一个字符串中 char source[] "Hello"; char destination[10]; strcpy(destination, source);strcat: 将一个字符串连接到另一个字符串的末尾 char str1[20] "Hello"; char str2[] "World"; strcat(str1, str2)…

三网话费余额查询的API系统,基于thinkphp6.0框架,附带搭建教程

系统用的是Thinkphp6.0框架 PHP版本需要用8.2 搭建教程 1、源码上传后&#xff0c;吧运行目录改为 /public 2、然后吧 数据库文件.sql 这个文件导入到数据库内 3、打开/config/database.php目录文件&#xff0c;然后进行配置数据库信息 4、挂任务计划&#xff0c;用处&…

运输层协议

运输层是OSI模型中的第四层&#xff0c;主要负责提供端到端的通信服务&#xff0c;包括错误检测、纠错、流量控制和拥塞控制等。以下是一些与运输层相关的常见协议&#xff1a; TCP&#xff08;Transmission Control Protocol&#xff09;&#xff1a; 描述&#xff1a;TCP是一…

未来的NAS:连接您的数字生活

未来的NAS&#xff1a;连接您的数字生活 引言 网络附加存储&#xff08;Network Attached Storage&#xff0c;简称NAS&#xff09;是一种通过网络连接的存储设备&#xff0c;用于集中存储和共享数据。传统的NAS设备通常包含一个或多个硬盘驱动器&#xff0c;可以通过局域网连…

【python】学习笔记01

一、基础语法 1. 字面量 - 什么是字面量&#xff1f; 在代码中&#xff0c;被写下来的的固定的值&#xff0c;称之为字面量。 - 常用的值类型 Python中常用的有6种值&#xff08;数据&#xff09;的类型。 666 13.14 "程序员"print(666) print(13.14) print(&qu…

服务器变矿机,该如何应对?

开始 恶意的挖矿程序会导致服务器cpu的异常占用&#xff0c;很让人讨厌。起初&#xff0c;我只是使用top命令显示出占用cpu不正常的进程&#xff0c;发现其中一个进程占用了百分之九十九点几&#xff0c;然后通过kill -9 <PID>命令干掉它。但总是过不了几天&#xff0c;…

C++三剑客之std::variant(二):深入剖析

目录 1.概述 2.辅助类介绍 2.1.std::negation 2.2.std::conjunction 2.3.std::is_destructible 2.4.std::is_object 2.5.is_default_constructible 2.6.std::is_trivially_destructible 2.7.std::in_place_type和std::in_place_index 3.原理分析 3.1.存储分析 3.2.…

Jira 宣布Data Center版涨价5%-15%,6年内第8次提价

近日&#xff0c;Atlassian官方面向合作伙伴发布2024年涨价通知&#xff1a; 自2024年2月15日起&#xff0c;旗下核心产品Jira Software、Confluence、Jira Service Management的DC版本&#xff08;Data Center版本&#xff09;价格提高5%-15%&#xff08;涨幅与坐席数阶梯相关…

Django中使用MySQL的视图View

文章目录 一、MySQL创建视图二、Django模型定义 一、MySQL创建视图 首先确定好自己需要链接的两张表及其对应的字段&#xff0c;视图的意义是将两张表数据联合一起变成一张新的表方便后续查询数据。 源Django两张表模型 class ProjectTaskRange(BaseModel, TimeModel):class …

IOS-高德地图SDK接入-Swift

申请key 这个要前往高德开发平台注册成为个人开发者然后在控制台创建一个应用&#xff1a; 高德开发平台 注册步骤就不写了&#xff0c;写一下创建应用的步骤&#xff1a; 1、点击应用管理——>我的应用 2、点击右上角的创建新应用 3、输入内容&#xff1a; 4、点击添加ke…

HBASE学习一:原理架构详解

1、架构原理 1.1、基本概念 HBase 是一款面向列存储,用于存储处理海量数据的 NoSQL 数据库。它的理论原型是Google 的 BigTable 论文。你可以认为 HBase 是一个高可靠性、高性能、面向列、可伸缩的分布式存储系统。 HBase 的存储是基于HDFS的,HDFS 有着高容错性的特点,被…

去除GIT某个时间之前的提交日志

背景 有时git提交了太多有些较早之前的提交日志&#xff0c;不想在git log看到&#xff0c;想把他删除掉。 方法 大概思路是通过 git clone --depth 来克隆到指定提交的代码&#xff0c;此时再早之前的日志是没有的 然后提交到新仓库 #!/bin/bash ori_git"gityour.gi…

HTML+JS+CSS歌词滚动效果

代码下载&#xff1a;【免费】HTMLJSCSS歌词滚动效果资源-CSDN文库 一些代码说明&#xff1a; 初始化歌词数据和时间字符串转换为秒数&#xff1a; // 初始化歌词数据 const initWords () > {let lines lrc.split(\n);let res [];lines.forEach(item > {let parts …

新定义51单片机(RD8G37)实现测距测速仪

本文描述用新定义51单片机&#xff08;RD8G37&#xff09;超声波一体测距传感器实现简单的测距测速仪。 测距仪演示效果 新定义RD8G37Q48RJ开发板 超声波测距模块&#xff1a; 8位并口屏 1、main.c unsigned short timeConsuming0; unsigned int oldDistance;void rectClearS…

阿里云国外服务器价格表

阿里云国外服务器优惠活动「全球云服务器精选特惠」&#xff0c;国外服务器租用价格24元一个月起&#xff0c;免备案适合搭建网站&#xff0c;部署独立站等业务场景&#xff0c;阿里云服务器网aliyunfuwuqi.com分享阿里云国外服务器优惠活动&#xff1a; 全球云服务器精选特惠…