代码随想录算法训练营第一天|Leetcode 704.二分查找、27移除元素

Leetcode 704二分查找

题目链接:

        题目思路:看见题目的第一想法是直接暴力解,for循环直接挨个扫描 ,O(n)的的时间复杂度。但是我发现我大错特错了!这道题用二分查找的方式更简单,快速。

       话不多说,这里我们直接附上代码!

def search(self, nums: List[int], target: int) -> int:
        left = 0 
        right = len(nums)-1 
        while left<=right:
            #计算中位索引
            mid = (left+right)//2
            if target>nums[mid]:
                left = mid+1 
            if target<nums[mid]:
                right  = mid -1 
            if target==nums[mid]:
                return mid 
        return -1 

首先我们使用一个左右指针分别指向数组的头与尾,这里有一个坑点,right = len(nums)还是len(nums)-1。涉及一个左开右闭和左闭右开的区间问题。

左闭右闭区间:也就是我们图中的例子,顺序是[left....mid-1] (mid) [mid+1....right-1]

左闭右开区间:也就是left=0,right=len(nums)。顺序是[left....mid-1) (mid) [mid+1.....right)

这里我们的while循环退出的条件就是 left==right.

过程中的难点:当我们思路想出来以后写下代码发现可能有死循环的情况。对于这种数据量小的题,我通常是直接画图然后跟着代码一行一行的走,很快可以找到问题,大部分是我们外层的while循环是应该用<还是<=,还有就是我们的mid,为了防止溢出,建议写成mid = left+(right-left)/2

Leetcode 27移除元素

题目链接:27. 移除元素 - 力扣(LeetCode)

        题目思路:还是老样子。我看见数组第一反应就是for循环,这里要用双层for循环。目前采取的第二种方法,设置快慢指针 slow&fast
def removeElement(self, nums: List[int], val: int) -> int:
        if len(nums)==0 or nums==[]:
            return 0
        slow = 0 
        fast = len(nums)-1 

        while slow < fast:
            while slow < fast and nums[slow]!=val:
                slow+=1 
            while slow < fast and nums[fast]==val:
                fast-=1
            nums[slow],nums[fast] = nums[fast],nums[slow]
        if nums[slow]==val:
            return slow 
        else:
            return slow+1

快指针的作用:查找新数组需要构成的元素

慢指针的作用:更换数组下标,一旦我们的快指针找到我们需要的元素

坑点:当我写完之后,我个人对这里的return slow和return slow+1有点疑惑。后来重新捋一遍之后发现,当我们退出最外层while loop之后,我们的slow与fast是==的,这就意味着我们指针之前那的元素都是我们最终留下的,但是当下指针所指向的元素也需要判断,如果当下指向的元素等于我们要删除的值,可以直接返回slow,因为nums[0:slow]是取不到当下这个值的hhhh真的是突然开窍了。如果当下的值不等于要删除的值,说明这个值也是我们所需要的,所以是nums[0:slow+1]才能取到。

暴力解法双层for容我稍后更新哈哈哈哈

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
第二十二天的算法训练主要涵盖了Leetcode题目中的三道题目,分别是Leetcode 28 "Find the Index of the First Occurrence in a String",Leetcode 977 "有序数组的平方",和Leetcode 209 "长度最小的子数组"。 首先是Leetcode 28题,题目要求在给定的字符串中找到第一个出现的字符的索引。思路是使用双指针来遍历字符串,一个指向字符串的开头,另一个指向字符串的结尾。通过比较两个指针所指向的字符是否相等来判断是否找到了第一个出现的字符。具体实现的代码如下: ```python def findIndex(self, s: str) -> int: left = 0 right = len(s) - 1 while left <= right: if s[left == s[right]: return left left += 1 right -= 1 return -1 ``` 接下来是Leetcode 977题,题目要求对给定的有序数组中的元素进行平方,并按照非递减的顺序返回结果。这里由于数组已经是有序的,所以可以使用双指针的方法来解决问题。一个指针指向数组的开头,另一个指针指向数组的末尾。通过比较两个指针所指向的元素的绝对值的大小来确定哪个元素的平方应该放在结果数组的末尾。具体实现的代码如下: ```python def sortedSquares(self, nums: List[int]) -> List[int]: left = 0 right = len(nums) - 1 ans = [] while left <= right: if abs(nums[left]) >= abs(nums[right]): ans.append(nums[left ** 2) left += 1 else: ans.append(nums[right ** 2) right -= 1 return ans[::-1] ``` 最后是Leetcode 209题,题目要求在给定的数组中找到长度最小的子数组,

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值