leetcode--搜索插入位置(难度:easy)

《流畅的python》的阅读也在继续当中。当然闲下来的时间也不能浪费,因此从昨天开始就走上了不归路——刷leetcode。
用的语言当然还是Python。希望保持每天一道题把。
今天的题是搜索插入位置,下面给出题目描述。
leetcode--搜索插入位置(难度:easy)
文章图片

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。
真的是非常的简明易懂,我还要继续努力像别人学习。

    推荐阅读