代码随想录算法训练营第一天| 数组理论基础,704. 二分查找,27. 移除元素

今天下班回来开始得比较晚,九点半才开始学,因为这部分之前刷过一遍,所以跳过数组基础,直接开始刷题了

704二分查找这道题,起初第一次看到搜索元素,就想到直接搜索,用循环遍历nums数组,找到target就返回数组下标,但是这样时间复杂度相对较高

题目中有序数组,利用有序可以直接缩短查找范围,快速找到目标值,于是凭着之前刷题的记忆,写下如下python代码

def search(self,nums,target):

            left=0

            right=len(nums)-1#数组最长下标=长度-1

            while(left<=right):

                i = (left + right) // 2

                if nums[i]<target:

                    left=i

                elif nums[i]>target:

                    right=i

                else:

                    return i

            return -1

但是结果超出时间限制(1/47,哭死),最后执行输入是[-1,0,3,5,9,12] 2

通过debug发现,最后卡在left=1,right=2的地方,在循环一次,i=1,但nums[i]=0<target,接下去left=1,那么left就在1无限循环了

所以left和right应该分别更新为i+1,i-1,这样就不会出现此情况了,最终AC代码如下:

def search(self,nums,target):

            left=0

            right=len(nums)-1#数组最长下标等于长度-1

            while(left<=right):

                i = (left + right) // 2

                if nums[i]<target:

                    left=i+1

                elif nums[i]>target:

                    right=i-1

                else:

                    return i

            return -1

45分钟写完第一题,然后开始27. 移除元素 ;

首先是暴力解法:

def removeElement(selfnumsval):

        """

        :type nums: List[int]

        :type val: int

        :rtype: int

        """

        lenth=len(nums)

        i=0

        while(nums[i]):

            if nums[i]==val:

                lenth-=1

                j=i

                while(nums[j+1]):

                    nums[j]=nums[j+1]

                    j+=1

            i+=1

        return (lenth,nums)

第一次提交,提示数组越界,错误在于while(nums[j+1]),本意是想判断,下一个元素存在;后边又一想,长度也在不停变化,用这种方法判断结束,肯定不正确

当i已经到数组最后值时,nums[j+1]会越界,所以将结束条件改为while(j<lenth),外层循环同理:

暴力解法第二个问题,如果i+1没有条件都+1的话,在删除操作后,会有元素漏删,所以,改为以下代码:

lenth=len(nums)

        i=0

        while(i<lenth):

            if nums[i]==val:

                lenth-=1

                j=i

                while(j<lenth):

                    nums[j]=nums[j+1]

                    j+=1

            else:

                i+=1

        return lenth

暴力解法AC,接下来是双指针法,虽然之前刷过一遍,但是只记得需要两个指针指向,具体的全忘记了,所以直接看了文章解说:

代码随想录

基本思路:fast--需要更新的元素slow--需要更新的坐标

不断让nums[slow]=nums[fast]

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值