算法(3)-数据结构-数组和字符串

leetcode-explore-learn-数据结构-数据结构-数组和字符串

  • 1. 一维数组
    • 1.0 概况
    • 1.1 寻找数组的中心索引
    • 1.2 搜索插入位置
    • 1.3 合并区间
    • 1.4 至少是其他数字两倍大的最大数
    • 1.5 加一
  • 2. 二维数组
    • 2.1旋转矩阵

本系列博文为leetcode-explore-learn子栏目学习笔记,如有不详之处,请参考leetcode官网:https://leetcode-cn.com/explore/learn/card/array-and-string/198/introduction-to-array/768/

1. 一维数组

1.0 概况

几个常见易混淆的概念:
集合: 一个/多个确定的元素构成的整体。一般种类相同,当然也可以不同。集合中的元素没有顺序。很多编程语言中拥有一些数据结构,是在集合的概念中增加了一些规则而来的。无序。

列表:(又称线性列表)一种数据项构成的有限的序列。即按一定顺序排列的数据项的集合。有序,长度可变。列表常见的表现形式有:数组,链表,堆栈,队列。

数组: 是一种最基本的数据结构,用于按顺序存储数据。数组中元素通过索引来实现读写操作。数组有一维数组,也有多维数组。一般编程语言中,数组具有固定容量,需要在初始化的时候确定数组大小,后续无法修改其长度。操作不是十分便利,于是大多编程语言提供了动态数组的数据结构,其大小可变。在Python中就没这么复杂,一个list数据结构就可以灵活满足众多需求。

数组基本操作:增、删、查、改
读:通过访问索引的方式来读取的,索引一般从 0 开始。访问的时间复杂度为o(1)。

1.1 寻找数组的中心索引

给定一个整数类型的数组,编程实现返回数组的中心索引。
中心索引的定义:中心索引左侧所有元素的和大于右侧所有元素的和。
特殊情况:如果中心索引不存在,返回-1;
如果存在多个中心所以,返回最左边的一个

思路:定义两个数组:
left_sum[i]=∑j=0i−1nums[j],i=1,2,3,...,n−1left\_sum[i]=\sum_{j=0}^{i-1}nums[j],\ \ i=1,2,3,...,n-1left_sum[i]=j=0i1nums[j],  i=1,2,3,...,n1

right_sum[i]=∑j=i+1n−1nums[j],i=n−2,n−3,...,0right\_sum[i]=\sum_{j=i+1}^{n-1}nums[j], \ \ i=n-2,n-3,...,0 right_sum[i]=j=i+1n1nums[j],  i=n2,n3,...,0

逐个比较left_sum与right_sum的元素,如果相同则返回对应索引,如果遍历完也没有相同的,则返回-1

例子:nums = [1, 7, 3, 6, 5, 6]
left_sum=[0,1,8,11,17,22]
right_sum=[27,20,17,11,6,0]

class Solution(object):def pivotIndex(self, nums):""":type nums: List[int]:rtype: int"""res = -1n = len(nums)left_sum = [0] * nright_sum  = [0] * nfor i in range(1, n):left_sum[i] = left_sum[i-1] + nums[i-1]for i in range(n-2, -1, -1):right_sum[i] = right_sum[i+1] + nums[i+1]for i in range(n):if left_sum[i] == right_sum[i]:res = ibreakreturn res 

1.2 搜索插入位置

给定一个排序数组和一个目标值,在数组中找到目标值,并返回其索引。如果目标值不存在于数组中,返回它将会被按顺序插入的位置。 请必须使用时间复杂度为 O(log n) 的算法。
二分查找能够实现 O(log n) 的时间复杂度。

class Solution(object):def searchInsert(self, nums, target):left_idx, right_idx = 0, len(nums)-1while(left_idx <= right_idx):# print(left_idx, right_idx)mid = int(left_idx + right_idx) / 2if nums[mid] == target:return midelif nums[mid] < target:left_idx = mid + 1elif nums[mid] > target:right_idx = mid - 1return left_idx

1.3 合并区间

以数组 intervals 表示若干个区间的集合,其中单个区间为 intervals[i] = [starti, endi] 。请你合并所有重叠的区间,并返回 一个不重叠的区间数组,该数组需恰好覆盖输入中的所有区间 。
输入:intervals = [[1,3],[2,6],[8,10],[15,18]]
输出:[[1,6],[8,10],[15,18]]
解释:区间 [1,3] 和 [2,6] 重叠, 将它们合并为 [1,6].
思路:先排序,然后再逐个合并就好了。

class Solution(object):def merge(self, intervals):intervals.sort(key = lambda x:x[0])res = []for interval in intervals:if res == [] or res[-1][1] < interval[0]:res.append(interval)else:res[-1][1] = max(res[-1][1], interval[1])return res

1.4 至少是其他数字两倍大的最大数

在一个给定的数组nums中,总是存在一个最大元素 。
查找数组中的最大元素是否至少是数组中每个其他数字的两倍。
如果是,则返回最大元素的索引,否则返回-1。

思路:
一次搜索,找最大值
二次搜索,判断是否符合两倍条件

class Solution(object):def dominantIndex(self, nums):""":type nums: List[int]:rtype: int"""n=len(nums)max_num=float("-INF")max_ind=-1for i in range(n):if nums[i]>max_num:max_num=nums[i]max_ind=ifor i in range(n):if i ==max_ind:continue# 判断是否是nums[i]的两倍if max_num<nums[i]*2:return -1return max_ind

1.5 加一

给定一个由整数组成的非空数组所表示的非负整数,在该数的基础上加一。
最高位数字存放在数组的首位, 数组中每个元素只存储单个数字。
你可以假设除了整数 0 之外,这个整数不会以零开头。

核心难点:有进位的情况该如何处理,因为是加一操作,大大简化了进位难度,因为只有可能产生的进位是1

思路1在这里插入代码片:直接在数组上操作,判断数组每位置数字是否产生进位:

class Solution(object):def plusOne(self, digits):""":type digits: List[int]:rtype: List[int]"""n=len(digits)digits[n-1]+=1# 判断进位,如何存储进位信息。flag=0for i in range(n-1,-1,-1):if flag==1:digits[i]+=1flag=0if digits[i]==10:digits[i]=0flag=1if flag!=0:res=[flag]for i in range(n):res.append(digits[i])return resreturn digits

思路2:数组转数字,数字+1处理,再转数组。

    def plusOne(self, digits):""":type digits: List[int]:rtype: List[int]"""# 整数转数字,加一之后转会数组n=len(digits)nums=0e=0for i in range(n-1,-1,-1):nums+=digits[i]*10**ee+=1nums+=1res=[]while(nums>0):digit=nums%10res.append(digit)nums=(nums-digit)/10res.reverse()return res

2. 二维数组

二维数组是一种结构较为特殊的数组,只是将数组中的每个元素变成了一维数组。所以二维数组的本质上仍然是一个一维数组,内部的一维数组仍然从索引 0 开始,可以将二维数组看作一个矩阵,并处理矩阵的相关问题。
在内存连续存储,

2.1旋转矩阵

将 N × N 矩阵顺时针旋转90度。
123456789(1)\begin{matrix} 1 & 2 & 3 \\ 4 & 5 & 6 \\ 7 & 8 & 9 \end{matrix} \tag{1} 147258369(1)

解题思路:
1.旋转90度后,(i, j)位置上的数字会换到(j, N-1-i)
2.每4个数字可以形成个循环圈,4 * 90 = 360:1会到3的位置,3会到9的位置,9会到7的位置,7会到1的位置。即这四个相互置换数字坐标满足:
{M[j,N−1−i]←M[i,j]M[N−1−i,N−1−j]←M[j,N−1−i]M[N−1−j,i]←M[N−1−i,N−i−j]M[i,j]←M[N−1−j,i]\left\{ \begin{aligned} M[j, N-1-i] & \leftarrow M[i, j]\\ M[N-1-i, N-1-j] & \leftarrow M[j, N-1-i] & \\ M[N-1-j, i] & \leftarrow M[N-1-i, N-i-j] \\ M[i, j] & \leftarrow M[N-1-j, i] \\ \end{aligned} \right. M[j,N1i]M[N1i,N1j]M[N1j,i]M[i,j]M[i,j]M[j,N1i]M[N1i,Nij]M[N1j,i]
3.仅需要旋转关键位置的数字即可:当 N为偶数时,我们需要枚举n2/4=(n/2)×(n/2)n^2/4=(n/2)×(n/2)n2/4=(n/2)×(n/2) 个位置,可以将该图形分为四块,当 n为奇数时,由于中心的位置经过旋转后位置不变,我们需要枚举 (n2−1)/4=((n−1)/2)×((n+1)/2)(n^2−1)/4=((n−1)/2)×((n+1)/2)(n21)/4=((n1)/2)×((n+1)/2)个位置.

class Solution(object):def rotate(self, matrix):N = len(matrix)for i in range(N//2):for j in range((N+1)//2):matrix[i][j], matrix[j][N-1-i], matrix[N-1-i][N-1-j], matrix[N-1-j][i]\= matrix[N-1-j][i], matrix[i][j], matrix[j][N-1-i], matrix[N-1-i][N-1-j]return matrix```

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

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

相关文章

redis的入门/原理/实战大总结

入门 Redis是一款基于键值对的NoSQL数据库&#xff0c;它的值支持多种数据结构&#xff1a; 字符串(strings)、哈希(hashes)、列表(lists)、集合(sets)、有序集合(sorted sets)等。 • Redis将所有的数据都存放在内存中&#xff0c;所以它的读写性能十分惊人&#xff0c;用作数…

创建与打开IPC通道的POSIX和SYSTEM V方法

先说&#xff30;&#xff2f;&#xff33;&#xff29;&#xff38;的吧&#xff1a; mq_open&#xff0c;sem_open&#xff0c;shm_open着三个函数用于创建或者打开一个IPC通道。 由此可见&#xff0c;消息队列的读写权限是任意的&#xff0c;然而信号灯就没有&#xff0c;…

算法(4)-leetcode-explore-learn-数据结构-数组2

leetcode-explore-learn-数据结构-数组21.简述2.例题2.1 二维数组的对角线遍历2.2 螺旋遍历2.3 杨辉三角本系列博文为leetcode-explore-learn子栏目学习笔记&#xff0c;如有不详之处&#xff0c;请参考leetcode官网&#xff1a;https://leetcode-cn.com/explore/learn/card/ar…

软件测试基础知识

第一章 1.1 软件测试背景知识和发展史 互联网公司职位架构&#xff1a;产品 运营 技术 市场 行政软件测试&#xff1a;使用人工或自动化手段&#xff0c;来运行或测试某个系统的过程&#xff0c;其目的在于检验它是否满足规定的需求或弄清预期结果与实际结果之间的差别&#…

key_t IPC键和ftok函数详解和剖析

统建立IPC通讯&#xff08;如消息队列、共享内存时&#xff09;必须指定一个ID值。通常情况下&#xff0c;该id值通过ftok函数得到。 ftok原型如下&#xff1a; key_t ftok( char * fname, int id ) fname就时你指定的文件名(该文件必须是存在而且可以访问的)&#xff0c;id是子…

算法(5)-leetcode-explore-learn-数据结构-字符串

leetcode-explore-learn-数据结构-数组3-字符串1.简述2.例题2.1 二进制求和2.2实现strStr()2.3最长公共前缀本系列博文为leetcode-explore-learn子栏目学习笔记&#xff0c;如有不详之处&#xff0c;请参考leetcode官网&#xff1a;https://leetcode-cn.com/explore/learn/card…

ipcs命令查看管道,消息队列,共享内存

修改消息队列大小&#xff1a; root&#xff1a;用户&#xff1a; /etc/sysctl.conf kernel.msgmnb 4203520 #kernel.msgmnb 3520 kernel.msgmni 2878 保存后需要执行 sysctl -p ,然后重建所有消息队列 ipcs -q : 显示所有的消息队列 ipcs -qt : 显示消息队列的创建时…

Jmeter-基础篇

常用压力测试工具对比 1、loadrunner 性能稳定&#xff0c;压测结果及细粒度大&#xff0c;可以自定义脚本进行压测&#xff0c;但是太过于重大&#xff0c;功能比较繁多 2、apache ab(单接口压测最方便) 模拟多线程并发请求,ab命令对发出负载的计算机…

消息队列接口API(posix 接口和 system v接口)

消息队列 posix API消息队列&#xff08;也叫做报文队列&#xff09;能够克服早期unix通信机制的一些缺点。信号这种通信方式更像\"即时\"的通信方式&#xff0c;它要求接受信号的进程在某个时间范围内对信号做出反应&#xff0c;因此该信号最多在接受信号进程的生命…

算法(6)-leetcode-explore-learn-数据结构-数组字符串的双指针技巧

leetcode-explore-learn-数据结构-数组4-双指针技巧1.双指针技巧--适用情形11.1概述1.2 例题1.2.1 反转字符串1.2.2数组拆分1.2.3 两数之和22双指针技巧-适用情形22.1概述2.2例题2.2.1 移除元素2.2.2 最大连续1的个数2.2.3长度最小的子数组本系列博文为leetcode-explore-learn子…

POSIX和SYSTEM的消息队列应该注意的问题

首先看看POSIX的代码&#xff1a; 1.posix_mq_server.c #include <mqueue.h> #include <sys/stat.h> #include <string.h> #include <stdio.h> #define MQ_FILE "/mq_test" #define BUF_LEN 128 int main() { mqd_t mqd; char b…

算法(7)-leetcode-explore-learn-数据结构-数组-小结

leetcode-explore-learn-数据结构-数组5-小结1.概述2.例题2.1旋转数组2.2 杨辉三角22.3翻转字符串里的单词2.4反转字符串中的单词32.5 删除排序数组中的重复项2.6 移动零本系列博文为leetcode-explore-learn子栏目学习笔记&#xff0c;如有不详之处&#xff0c;请参考leetcode官…

fcntl函数详解

功能描述&#xff1a;根据文件描述词来操作文件的特性。 #include <unistd.h> #include <fcntl.h> int fcntl(int fd, int cmd); int fcntl(int fd, int cmd, long arg); int fcntl(int fd, int cmd, struct flock *lock); [描述] fcntl()针对(文件)描述符提供控…

使用nohup让程序永远后台运行

使用nohup让程序永远后台运行 Unix/Linux下一般比如想让某个程序在后台运行&#xff0c;很多都是使用 & 在程序结尾来让程序自动运行。比如我们要运行mysql在后台&#xff1a; /usr/local/mysql/bin/mysqld_safe --usermysql &但是加入我们很多程序并不象mysqld一样做…

算法(8)-leetcode-explore-learn-数据结构-链表

leetcode-explore-learn-数据结构-链表11.概述1.1 链表插入操作1.2 链表删除操作2.设计链表本系列博文为leetcode-explore-learn子栏目学习笔记&#xff0c;如有不详之处&#xff0c;请参考leetcode官网&#xff1a;https://leetcode-cn.com/explore/learn/card/linked-list/所…

Mysql索引优化实例讲解

MYSQL描述&#xff1a;一个文章库&#xff0c;里面有两个表&#xff1a;category和article。category里面有10条分类数据。article里面有20万条。article里面有一个"article_category"字段是与category里的"category_id"字段相对应的。article表里面已经把…

给自己的VIM配置

编辑 .vimrc 文件如下&#xff1a; filetype plugin on "autocmd Filetype cpp,c,java,cs set omnifunccppcomplete#Complete set nu set nocp set nobackup let g:C_AuthorName gaoke let g:C_AuthorRef gaoke let g:C_Email gaoketaomee.…

shell一文入门通

简单来说“Shell编程就是对一堆Linux命令的逻辑化处理”。 W3Cschool 上的一篇文章是这样介绍 Shell的 hello world 学习任何一门编程语言第一件事就是输出HelloWord了&#xff01;下面我会从新建文件到shell代码编写来说下Shell 编程如何输出Hello World。 (1)新建一个文件…

算法(9)--两个数的最大公约数

两个数的最大公约数1.辗转相除法求解两个数的最大公约数2.更相减损术求解两个数的最大公约数3.不严格理解1.辗转相除法求解两个数的最大公约数 辗转相除法&#xff1a;两个正整数a和b&#xff08;a>b&#xff09;的最大公约数等于a除以b的余数与b 之间的最大公约数。–如果…

RPC编程

图 3 说明在客户机和服务器之间完成 RPC 涉及的步骤。 图 3. 在客户机和服务器之间完成 RPC 涉及的步骤服务器 RPC 应用程序初始化期间它会向 RPC 运行时库注册接口。需要注册接口是因为&#xff0c;客户机在向服务器发出远程过程调用时&#xff0c;要检查它是否与服务器兼容。…