算法训练营 | Day 1 数组 (二分查找)

还没有完善有空再来写^^

基础理论:

重点: 数组在内存中的存储方式

  • 数组下标为0
  • 内存空间的地址是连续的(27题)
  • 二维数组为索引的形式(ex: a[0][1])

704. 二分查找

难点 区别左闭右闭

易错点 :

while - left ≤ right / left< right

左闭右闭 [left,right] - target 在left and right 闭合的区间里 ****

left ≤ right

左闭右开[left,right) left< right

middle > target

不包含右边区间 当nums[middle] > target, right = middle

35. 搜索插入位置

[1,3,5,6] target = 5 输入左闭右闭的情况 所以 left <= right

如果找不到 需要讲数字放入l 和 r 之间

while条件结束时 left = right + 1 处

				l = 0
        r = len(nums) -1
        while l <= r:
            m = (l+r)//2

            if nums[m] <target:
                l = m+1
            elif nums[m] > target:
                r = m -1
            else:
                return m
        return r +1

# if target < nums[middle]:
            return middle 
        else:
            return middle + 1

27. 移除元素

暴力法

遍历整个数组 如果遇到val就remove这个值 最后返回 len(nums) 因为本题 nums.length 最大100 所以暴力法可行

class Solution:
    def removeElement(self, nums: List[int], val: int) -> int:
        a = 0
        while a < len(nums):
            if nums[a] == val:
                nums.remove(val)
            else:
                a += 1
        return len(nums)

Two pointer(双指针)

和以往的双指针方法稍有不同 两个指针的起始点都是0

左指针遍历整个数组 右指针停留当当时找到val的位置 如果发现左指针 ≠ val

class Solution:
    def removeElement(self, nums: List[int], val: int) -> int:
        l = 0
        r = 0
        while l < len(nums):
            if nums[l] != val:
                nums[r] = nums[l]
                r += 1
            l += 1
        return r
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
二分查找是一种常用的查找算法,可以在有序的数组中快速定位目标值。对于一个有序的数组,我们可以使用二分查找来找到目标值的位置。 具体的二分查找算法如下: 1. 确定搜索范围,首先将整个数组作为搜索范围。使用两个指针 `left` 和 `right` 分别指向搜索范围的起始位置和结束位置。 2. 计算中间位置 `mid`,`mid = (left + right) / 2`。 3. 比较中间位置的元素与目标值的大小。如果中间位置的元素等于目标值,则直接返回中间位置。 4. 如果中间位置的元素大于目标值,则说明目标值应该位于左半部分。更新搜索范围为左半部分,即 `right = mid - 1`。 5. 如果中间位置的元素小于目标值,则说明目标值应该位于右半部分。更新搜索范围为右半部分,即 `left = mid + 1`。 6. 重复步骤 2 到步骤 5,直到找到目标值或者搜索范围为空。 以下是使用二分查找在一个有序的整数数组中查找目标值的示例代码(C++语言): ```cpp int binarySearch(vector<int>& nums, int target) { int left = 0; int right = nums.size() - 1; while (left <= right) { int mid = left + (right - left) / 2; if (nums[mid] == target) { return mid; // 找到目标值,返回索引 } else if (nums[mid] < target) { left = mid + 1; // 目标值在右半部分 } else { right = mid - 1; // 目标值在左半部分 } } return -1; // 搜索范围为空,未找到目标值 } ``` 请注意,以上代码假设输入的 `nums` 数组是有序的。如果数组无序,需要先进行排序再使用二分查找算法。 希望以上内容能够帮助到你!如有更多问题,请继续提问。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值