leetcode--搜索插入位置(难度:easy)
《流畅的python》的阅读也在继续当中。当然闲下来的时间也不能浪费,因此从昨天开始就走上了不归路——刷leetcode。
用的语言当然还是Python。希望保持每天一道题把。
今天的题是搜索插入位置,下面给出题目描述。
文章图片
class Solution:
def searchInsert(self, nums, target):
if target in nums:
index = nums.index(target)
return index
for i in range(len(nums)):
index = None
if target <= nums[i]:
index = i
elif target > nums[i] and len(nums) == 1:
index = len(nums)
elif target > nums[len(nums)-1]:
index = len(nums)
elif target > nums[i] and target <= nums[i + 1]:
index = i + 1
else:
continue
return index
因为我实在是太弱了,所以用了这么多步骤。
首先我们判断target是否在列表里面,在的话直接使用内置的index返回对应的下标即可。
如果不在列表里面,就分为五步。
1.判断target是否比等于或者小于第一个元素,是的话返回index
2.如果大于第一个元素,就要知道这个列表是不是只有一个元素。如果不加上and len(nums) == 1:的话,就会导致越界报错。
如果列表一开始只有一个元素,那么直接返回len(nums),因为数组的长度要比最后一位的下标多1
【leetcode--搜索插入位置(难度:easy)】3.如果target比最后一个元素大,那么就跟第二点一样。
4.否则元素就应该插入列表中间,这个时候我们要判断target比前一个大而且比后一个小,然后返回i + 1
5.在第4步的时候,如果target比前一个大,但是也比后一个大的话,并且在没有continue的情况下,就会直接返回None,这不是我想要的,因此在这种情况下我们应该让循环继续,所以需要continue.
总结,说实话这还只是easy的题,我看到题目的时候觉得很简单,但是一下手又频频出错,信心全无。虽然过程繁琐,但也还是硬着头皮做出来了。这是我第一次刷Leetcode,被来了个下马威哈哈哈。
不过这种做法需要考虑的是就是第四点。我一开始没有加上else:continue的时候,没有报错,但是返回的位置不对。就是比如、[1,3,5,6],然后加入4的时候,会发现返回的是None,说明在进行第四步的时候,4比1大,也比3大,所以进入第4步的else语句里面,直接就返回None了。
因此还不能停下循环,要继续循环,所以需要加上continue,直到找到该插入的位置再返回index。
运行的时间是52ms,虽然挺快的,但是步骤繁琐。
下面给大家看一下也是52ms但是很简洁的一段代码。
class Solution:
def searchInsert(self, nums, target):
"""
:type nums: List[int]
:type target: int
:rtype: int
"""
n=len(nums)
if target>nums[n-1]:
return n
for k in range(n):
if target<=nums[k]:
return k
看到之后真的是觉得自己简直是菜到不行了。
if语句判断是否大于最后一个元素,是的话返回n即可,因为n-1表示最后一个元素的下标,所以插入target后最后一个元素的下标就是n。(有了这一步,我自己写的那个判断列表是否只有1个元素的判断语句就可以作废了,伤心。)
range(n)表示从0~n-1,for循环遍历列表,如果比nums[k]大就继续循环,否则就插入nums[k]所在的下标k,最后返回k。
真的是非常的简明易懂,我还要继续努力像别人学习。
推荐阅读
- 【译】20个更有效地使用谷歌搜索的技巧
- 二叉树路径节点关键值和等于目标值(LeetCode--112&LeetCode--113)
- locate搜索
- springboot结合redis实现搜索栏热搜功能及文字过滤
- 茶事|茶事 | 单丛里的一泡奇葩
- Pytorch学习|sklearn-SVM 模型保存、交叉验证与网格搜索
- 销量搜索
- 技术|为参加2021年蓝桥杯Java软件开发大学B组细心整理常见基础知识、搜索和常用算法解析例题(持续更新...)
- 17个搜索引擎
- 搜索引擎有哪些