代码随想录训练营第一天 || 1.二分查找 2.移除元素 3.有序数组的平方

1.二分查找

文档讲解:代码随想录

力扣链接

思路:

将一个有序的范围,不断对半缩小,从而缩短查找时间

第一想法:

想直接把范围对半分开,但是忽略了这是一个动态的过程,二分之后,如果没有找到目标值,会再次进行二分,直到找到目标值,或者范围已经缩小到0

看完代码随想录:

明白这是一个动态过程,并且学会如何改变左右指针的值来缩小范围,以及如何处理不同边界问题的二分查找

代码

第一种(左闭右闭)

class Solution:
    def search(self, nums: List[int], target: int) -> int:
        right,left=len(nums)-1,0
        while left<=right:
            mid=(right+left)//2#注意//是除法运算取整
            if nums[mid]==target:
                return mid
            elif nums[mid]<target: #中间值比目标值小,调整左指针指向中间值大一位
                left =mid +1
            elif nums[mid]>target:
                right =mid -1
        return -1

第二种(左闭右开)

class Solution:
    def search(self,nums :list[int],target : int )->int:
        right,left=len(nums)-1,0
        while left<right :
            mid =(left+right)//2
            if nums[mid]>target:
                right =mid
            elif nums[mid]<target:
                left = mid +1
            else:
                return mid
        return -1

遇到的问题:

1.//和/的区分://除法运算后取整,/除法运算后变为浮点数

2.边界问题:当都为闭区间时,left==right时,仍然成立 例子:最后剩下两个数,中间值的下标索引为1,此时未找到目标值,把左指针向右调整1,此时left==right但当有一边为开区间时left==right的情况就不成立,类比前边的例子在调整指针时,不可以调整到中间值的两边,而是等于中间值的下标索引,否则在极限情况,只有两个元素时会导致左右指针,指向区间两边不包含的数

2.移除元素

文档讲解:代码随想录

力扣链接

思路:

           1.暴力:

                先一个循环查找要移除的元素,再一个循环移除元素

           2.双指针:

                快慢指针,慢指针跟随快指针移动,快指针查找要移除的元素,慢指针指向要更改的元素,慢指针接收快指针指向的非移除元素,当指向移除元素时通过慢指针原地踏步一次,拒绝接收要移除的元素,从而移除元素

第一想法:

没有想到快慢指针,想到暴力

看完代码随想录:

明白了双指针思路,感觉非常的巧妙

代码:

class Solution:
    def removeElement(self, nums: List[int], val: int) -> int:
        l=len(nums)
        fast,slow=0,0
        while fast<l :
            if nums[fast] !=val:
                nums[slow]=nums[fast]
                slow+=1
            fast+=1
        return slow

遇到的问题:

1.双指针思路及过程的理解

3.有序数组的平方:

文档讲解:代码随想录

力扣链接

思路:

左右指针法:

因为数组是升序排列,并且有正有负,题目要求每个数的平方,并且按照升序排列,发现负数平方后会打乱原本的顺序,发现平方的大小与绝对值有关,发现两边的绝对值相对中间较大,所以通过左右指针,寻找最大值,并且排序

第一想法:

之前做过一遍,有了第2题移除元素的左右指针思路,直接就想到了

看完代码随想录:

进一步加深思路

代码:

class Solution:
    def sortedSquares(self, nums: List[int]) -> List[int]:
        size =len(nums)
        left,right=0,size-1
        answer=[0]*size # 1.定义列表问题
        i=size-1
        while left<=right:
            a =nums[left]**2
            b =nums[right]**2
            if a<=b:
                answer[i]=b #放入答案,初始i=sizee-1,是答案集的最后
                i-=1
                right-=1
            elif a>b :
                answer[i]=a
                i-=1
                left+=1
        return answer

遇到的问题:

1.定义列表问题:因为想要使用列表的索引,把结果输入到结果集answer,但在定义时直接定义了空列表,错误出在空列表没有索引,无法通过索引操作

2.放入答案集answer的顺序:因为先查找平方值大的数,并且还要升序,所以从后向前放入答案

今日总结:

今天是第一天,对于突然提高数量的刷题节奏还不是太适应,但这也大大提高了本人的效率,加油

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值