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

分查找

题目704:

代码随想录算法训练营第一天 | 704 二分查找、27 移除元素_第1张图片

链接:

[二分查找]  https://leetcode.cn/problems/binary-search/ 

思路:

前提:数组为有序数组,且无重复元素

当看到题目满足上述前提的时候,就可以考虑使用二分法了。

写二分法,区间定义一般有两种:左闭右闭[left,right]、左闭右开[left,right)

1.左闭右闭区间

区间的定义决定了二分法代码的书写,因为定义target在[left,right]区间,所以有:

  • while 循环中的条件要使用(left<=),此时的left==right是有意义的

  • if判断条件的(nums[middle]>target) right 赋值要为middle-1,因为当前这个nums[middle]不一定是target,如果不是,那下一次就从middle-1开始(左区间)

 def search(self, nums: List[int], target: int) -> int:
         # 第一种写法
         left = 0 # 初始化left的下标
         right = len(nums)-1 # 初始化right的下标
         while left <= right:
             middle = (left + right)//2 # 使用整除
             if nums[middle] > target:
                 right = middle - 1
                 
             elif nums[middle] < target:
                 left = middle + 1
             elif nums[middle] == target:
                 return middle
         return -1

注意:在这里我遇到了一个错误,就是找不到值的时候返回-1,我写在循环里面了,事实上,如果找不到值,循环会跳出来,并不会执行我所期待的语句。因此,如果找不到值的话,要在while循环外面写return -1

2. 左闭右开区间

左闭右开区间的注意点:

  • while循环判断条件(left

 第二种写法: 左闭右开
         left = 0
         right = len(nums)
         while left < right:
             middle = (right+left)>>1
             # 进行判断
             if nums[middle] > target:
                 right = middle
             elif nums[middle] < target:
                 left = middle + 1
             else:
                 return middle
         return -1

总结:

本节详细讲述了二分查找的基本思想,以及两种边界条件。首先提出了二分查找的前提:有序,不重复。然后给出了两种边界条件:左闭右闭以及左闭右开。

当选择使用左闭右闭或者左闭右开的条件时,自己要先考虑最终的情况,只有一个元素的时候,是什么情况,当考虑清除是什么情况之后,才能写得while循环条件里的内容。

3.移除元素

题目27:代码随想录算法训练营第一天 | 704 二分查找、27 移除元素_第2张图片

代码随想录算法训练营第一天 | 704 二分查找、27 移除元素_第3张图片

题目链接:力扣

解题思路:

本题可以采用两种方法,一种暴力解决,两个for循环即可,另一种是 双指针法,双指针法使用两个指针,一个快指针,一个慢指针,操作在同一个数组。快指针用来遍历所有的元素,慢指针用来对数组进行操作,当快指针遍历到非删除的元素时,将元素值覆盖到慢指针所在位置,并且慢指针自增,当快指针遍历到需要删除的元素时,慢指针不操作。

1.暴力解决:

 
class Solution:
     def removeElement(self, nums: List[int], val: int) -> int:
         lenth=len(nums)
         m,i=0,0
         while i < lenth:     #用for不能改变i的值
             if nums[i] == val:
                 m+=1
                 for j in range(i + 1, ls):
                     nums[j - 1] = nums[j]
                 ls -= 1
                 i -= 1
             i += 1             
         return ls

2.双指针法

 fast = 0
         slow = 0
         while fast

总结:

本小结主要刷了移动元素的题目,因为数组是连续存放的,所以,删除其中的元素时,要移动后面的元素,这里巧妙地使用了双指针法,在一个数组上面实现了移动和删除。

你可能感兴趣的:(算法,leetcode)