自己的算法记录 | Day1 数组Part01

LeetCode704 二分查找

题目链接
省流总结:理解左闭右闭、左闭右开区间的定义来映射边界的规则,就很容易写出来了。

题目描述:给定一个 n 个元素有序的(升序)整型数组 nums 和一个目标值 target ,写一个函数搜索 nums 中的 target,如果目标值存在返回下标,否则返回 -1。
提示:
你可以假设 nums 中的所有元素是不重复的。
n 将在 [1, 10000]之间。
nums 的每个元素都将在 [-9999, 9999]之间。

解题思路:(二分查找)

  • 前置条件促使我们可以使用二分查找法,定义中间数+两个指针left和right。
  • 然后利用两个区间来建立我们边界的规则。
  • 先利用中间数判断往左半边还是右半边来继续查找。
第一种解法(左闭右闭 : [left,right]):
class Solution:
    def search(self, nums: List[int], target: int) -> int: # 这是类型说明的用法,第一次学到
        left, right = 0, len(nums) - 1 # 首先定义指针初始值

        while (left <= right):# 注意这里用的是小于等于,这是因为我们采用的是左闭右闭的区间,包含了左右两边的数
            mid = (left + right) // 2 # 初始化中间值

            if nums[mid] > target: # 判断往哪边继续寻找
                right = mid -1
            elif nums[mid] < target:
                left = mid + 1
            else:
                return mid
        return -1
第一种解法(左闭右开 : [left,right)):
    def search(self,nums: List[int],target:int) -> int:
        left,right = 0,len(nums)# 这里不需要减一,因为我们不需要包含右区间
        while left < right:# 因为当left == right的时候,在[left, right)是无效的空间,所以使用 <
            mid = (left + right) // 2
            if nums[mid] > target:
                right = mid
            elif nums[mid] < target:
                left = mid + 1
            else:
                return mid
        return -1

体会:第一次刷算法题,其实有点思路但是不知道怎么实现,通过观看讲解视频和源码试着自己模仿的敲出了,希望二刷的时候能单独敲出来。

LeetCode 27-移除元素

题目链接
题目描述:给你一个数组 nums 和一个值 val,你需要 原地 移除所有数值等于 val 的元素,并返回移除后数组的新长度。

解题思路:

  • 这题有暴力法和双指针法来求解,暴力法的复杂度是O(n^2),双指针的复杂度是O(n)。
  • 首先是暴力法,就很直接的用了双for循环来完成,一个遍历一个用来修改覆盖元素。
  • 双指针法是采用了两个指针在同一个循环里完成操作,这个是重点解法。
暴力法:
class solution():
    def removeElement(self, nums: List[int], val: int) -> int:
        i, l = 0, len(nums)
        while i < l:  # 遍历整个数组
            if nums[i] == val: # 这个方法主要是找到要修改的元素,然后再利用第二个循环来讲后面的逐一覆盖
                for j in range(i + 1, l): 
                    nums[j - 1] = nums[j]
                l -= 1
                i -= 1
            i += 1  # 循环结束条件
        return l  # 返回新数组长度
双指针法(重点):
class Solution():
    def removeElement(self,nums:List[int],val:int) ->int:
        fast = 0
        slow = 0
        size = len(nums)
        while(fast < size):# 这个方法我理解是主要是找到不需要修改的元素,然后将他们组合成新的数组
            if nums[fast] != val:
                nums[slow] = nums[fast]
                slow +=1
            fast +=1
        return slow # 新数组的长度

体会:时间不够,其实并不算理解透测,希望自己之后能有时间再复习再修改完善一下博客。

评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值