数组经典题目

这篇博客详细讲解了数组算法中的经典问题,包括利用二分查找解决查找和搜索问题,双指针法在移除元素场景的应用,以及滑动窗口在求解连续子数组的最短长度问题上的巧妙运用。通过实例解析和相关题目,深入理解这些算法的原理和应用。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

一、二分查找

题目704.二分查找.
给定一个 n 个元素有序的(升序)整型数组 nums 和一个目标值 target ,写一个函数搜索 nums 中的 target,如果目标值存在返回下标,否则返回 -1。

题目中的前提条件有:
1.数组为有序数组
2.数组中无重复元素

数组有序是使用二分法的前提,而且如果有重复元素,二分查找返回的元素下标可能不是唯一的,这些都是使用二分法的前提,看到题目满足如上条件时,可以考虑一下是不是可以使用二分法。

二分法的思想虽然简单,但涉及边界条件,需要清楚定义区间,也就是定义不变量,在二分查找的过程中(即while),每一次边界的处理都要坚持根据区间的定义来操作。

一般来说可以使用左闭右闭,即[left,right],定义target在这个区间里。
因此需要注意以下两点:

  1. while(left <= right),这里使用<=,因为left==right是有意义的
  2. if(nums[mid] > target)时,right赋值为mid-1,因为当前的nums[mid]不可能等于target,相反left就该赋值为mid+1

题解:

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:
               return mid
           elif nums[mid] > target:
               right = mid - 1
           else:
               left = mid + 1
       return -1

理解之后可以做一下以下题目:
35.搜索插入位置.
34. 在排序数组中查找元素的第一个和最后一个位置.

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值