python刷题用leet乘风破万_leetcode刷题_数组专项(入门级别)_这几道题都不会可真不行!...

最近比较忙,看书时间比较少,闲暇时间就用来刷题了,所以就分享下我最近刷的题吧,我是按照题型来的,先说数组类,从最基础的开始。ps我个人认为,算法真的博大精深,没有什么一蹴而就的方法,无非就是刷刷刷,尤其在解决了问题之后,要想一想是否有可以优化的地方,然后去看看别人写的比较好的解决方案。

010~n-1中缺失的数字

题目描述

一个长度为n-1的递增排序数组中,所有数字都是唯一的,并且每个数字都在范围0~n-1之内。在范围0~n-1的n个数字中有且只有一个数字不在该数组中,请找出这个数字,示例如下:

数组:[0,1,2,3,4,5,6,7,9], 数组长度为9,缺少的数字为8数组:[0,1,3], 数组长度为3,缺少的数字为2思路及代码

暴力法

递增有序,相邻数据呈现+1的规律,那么我完全可以构造数据范围内的所有数据,然后和原数据按照索引位置对比就行了,代码如下

二分法

ps:一般题目条件中碰到有描述数据呈现有序的特点的,基本都是希望你用二分法解决

通过画图可以分析出只有两种情况:1.mid == (right + left) // 2,(索引大小和索引值相等则代表当前索引之前的数字是不缺失的,那么继续在索 引值后面的位置搜索即可)2.nums[mid] > mid,则代表着缺少的值在当前索引的前面位置,所以往前面去找就行了

代码

02高度检查器

题目描述

给一个无序列表,那么同时假设也存在这么一列表,是这个无序列表的有序展示,那么把无序表和有序表的相同索引位置进行对比的话,有几个不一样(数据大小为1-100之间),示例如下:

输入:eights = [1, 1, 4, 2, 1, 3]输出:3解释:原数组排序之后的数组为 [1, 1, 1, 2, 3, 4], 那么发现只有索引位置为0,1和3的位置一模一样,所以返回3,代表 3个位置放置的位置错误思路及代码

1.基于计数排序

因为基数数据范围限定了1-100,而且基数排序的时间复杂度是线性的,那么这里用作排序最合适不过了(我知道有些人会说python中直接用sort可以排序,但这道题就没有意义了,而且sort的复杂度是nlogn)

1.选择一个排序方法进行排序2.按照索引位置进行对比数据即可

代码

03最长连续递增序列

题目描述

给定一个未经排序的整数数组,找到最长且连续的的递增序列,并返回该序列的长度,示例如下:

输入:[1,3,5,4,7]

输出:3

解释: 最长连续递增序列是 [1,3,5], 长度为3。尽管 [1,3,5,7] 也是升序的子序列, 但它不是连续的,因为5和7在 原数组里被4隔开

思路及代码

1.暴力法

1.从头开始遍历数组,如果相邻两个数据的后一个小于等于前一个,则记录结束位置,存放起来2.从当前位置作为开始,找下一个结束位置,记录长度,以此类推···

代码

2.基于栈结构

我这里描述下思路,不写代码了,比较简单

1.遍历数组,利用栈结构,将递增元素分别入栈,直到一个小于栈顶元素出现,将栈队清空,并记录长度2.继续遍历数组,跟上面的步骤一样,如果一直没有出栈条件,则统计栈长度即可3.返回存放的最大长度

04拼写单词

题目描述

给你一份『词汇表』(字符串数组) words 和一张『字母表』(字符串) chars。

假如你可以用 chars 中的『字母』(字符)拼写出 words 中的某个『单词』(字符串),那么我们就认为你掌握了这个单词。注意:每次拼写(指拼写词汇表中的一个单词)时,chars 中的每个字母都只能用一次。返回词汇表 words 中你掌握的所有单词的 长度之和,示例如下:

输入:words = ["cat","bt","hat","tree"],chars = "atach"

输出:6

解释:charts中的字母可以组成字符串 "cat" 和 "hat",所以答案是 3 + 3

思路及代码

1.哈希

1.一看到这题,我就觉得应该是哈希解决,所以第一步先转成了字典,键为字符,值为出现的次数2.然后判断单词是否是charts_dic的子集就可以了,我这里用了个函数判断,个人觉得比较好理解

代码

2.优化版本,利用标准库

我知道collections的那个方法,我也想用来着。后来觉得万一不让用标准库呢,所以就用了字典推倒,但是就因为我用了字典推导性能竟然下降了一半,空间使用差不多

05将每个元素替换为右侧最大元素

06题目描述

给你一个数组 arr,请你将每个元素用它右边最大的元素替换,如果是最后一个元素,用 -1替换。完成所有替换操作后,请你返回这个数组。示例如下:

输入:arr = [17,18,5,4,6,1]

输出:[18,6,6,6,1,-1]

解释:17右边最大的是18,进行替换;18右边最大的是6,进行替换···

思路及代码

1.暴力法

挨个遍历,每替换完一个右边最大值,就再求出右边的最大值(因为python自带max函数,求最大值就很简单,但是其他语言,比如java就需要自己写求最大值的方法),再进行替换···

2.不知名方法

其实我们可以发现,从左往右,肯定要每次都重新求最大值,再去替换,那么换个思路,从右往左呢?

代码

3.基于栈

首先分析也是从右往左分析我就在想,这道题肯定可以用栈队解决,因为我只要保证栈中的元素为当前最大值即可,举个例子:对于[17,18,5,4,6,1]来说,我遍历到6的时候,我需要保证当前栈顶元素为6后面的最大值,也就是1;当我遍历到4的时候,我需要保证当前栈顶元素为4后面的最大值,也就是6;当我遍历到5的时候,此时最大值还是6,那么栈顶元素不会发生变化···所以栈顶元素的替换仅仅在遍历的当前数据大于栈顶数据时!

代码

本章!

我是一名奋战在编程界的pythoner,工作中既要和数据打交道,也要和erp系统,web网站保持友好的沟通……时不时的会分享一些提高效率的编程小技巧,在实际应用中遇到的问题以及解决方案,或者源码的阅读等等,欢迎大家一起来讨论!如果觉得写得还不错,欢迎关注点赞,谢谢。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值