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

本文记录了作者在LeetCode上刷题的过程,分享了一道关于搜索插入位置的简单题目。作者通过详述自己的解题思路,讨论了Python实现的细节,包括特殊情况的处理,如列表只有一个元素的情况。虽然作者的初始解决方案步骤较多,但最终找到了一个简洁的52ms解决方案,认识到自己需要继续学习和提高。
摘要由CSDN通过智能技术生成

《流畅的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

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。

真的是非常的简明易懂,我还要继续努力像别人学习。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值