当前位置: 首页 > news >正文

第一节:关于数组的算法(python版)

目录

一、存储方式

二、二分查找

三:数组的算法操作:双指针算法

四、数组操作:滑动窗口


视频讲解地址:动态-哔哩哔哩

一、存储方式

在python中的list本质是动态数组,支持自动扩容。还有一个numpy数组,二维支持连续内存储存

数组是存放在连续内存空间上的相同类型数据的集合,但是对于二维的数组在c或c++中内存是完全连续的,在java或python中是有多个独立的一维数组组成内存可能不连续(numpy除外)。

数组下标是从0开始的

因为数组的储存方式是连续的,那么我们删除或者添加元素的时候就要移动其他元素的地址,导致时间复杂度有o(n),但是访问方便,通过下标直接访问,时间复杂度只有o(1)。

二、二分查找

704. 二分查找

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


示例 1:

输入: nums = [-1,0,3,5,9,12], target = 9
输出: 4
解释: 9 出现在 nums 中并且下标为 4

示例 2:

输入: nums = [-1,0,3,5,9,12], target = 2
输出: -1
解释: 2 不存在 nums 中因此返回 -1

基于分治策略,通过不断的将有序的数组分成两半,缩小搜索范围,直到找到目标元素或确认不存在。时间复杂度为O(log n),效率远超线性查找

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:
                left = mid + 1    # 目标在右半部分
            else:
                right = mid - 1   # 目标在左半部分
        return -1                 # 未找到到

相关题目leetcode704 

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

示例 1:

输入: nums = [-1,0,3,5,9,12], target = 9
输出: 4
解释: 9 出现在 nums 中并且下标为 4

示例 2:

输入: nums = [-1,0,3,5,9,12], target = 2
输出: -1
解释: 2 不存在 nums 中因此返回 -1

class Solution:
    def search(self, nums: List[int], target: int) -> int:
        i, j = 0, len(nums) - 1
        while i <= j:
            m = (i + j) // 2
            if nums[m] < target: i = m + 1
            elif nums[m] > target: j = m - 1
            else: return m
        return -1

三:数组的算法操作:双指针算法

以leetcode977. 有序数组的平方为例:

给你一个按 非递减顺序 排序的整数数组 nums,返回 每个数字的平方 组成的新数组,要求也按 非递减顺序 排序。

    示例 1:

    输入:nums = [-4,-1,0,3,10]
    输出:[0,1,9,16,100]
    解释:平方后,数组变为 [16,1,0,9,100]
    排序后,数组变为 [0,1,9,16,100]

    示例 2:

    输入:nums = [-7,-3,2,3,11]
    输出:[4,9,9,49,121]
    
    class Solution:
        def sortedSquares(self, nums: List[int]) -> List[int]:
            l, r, i = 0, len(nums)-1, len(nums)-1
            res = [float('inf')] * len(nums) # 需要提前定义列表,存放结果
            while l <= r:
                if nums[l] ** 2 < nums[r] ** 2: # 左右边界进行对比,找出最大值
                    res[i] = nums[r] ** 2
                    r -= 1 # 右指针往左移动
                else:
                    res[i] = nums[l] ** 2
                    l += 1 # 左指针往右移动
                i -= 1 # 存放结果的指针需要往前平移一位
            return res

    四、数组操作:滑动窗口

    • 1456. 定长子串中元音的最大数目 1263

    给你字符串 s 和整数 k 。

    请返回字符串 s 中长度为 k 的单个子字符串中可能包含的最大元音字母数。

    英文中的 元音字母 为(aeiou)。

    示例 1:

    输入:s = "abciiidef", k = 3
    输出:3
    解释:子字符串 "iii" 包含 3 个元音字母。
    

    示例 2:

    输入:s = "aeiou", k = 2
    输出:2
    解释:任意长度为 2 的子字符串都包含 2 个元音字母。
    class Solution:
        def maxVowels(self, s: str, k: int) -> int:
            i,j=0,0
            res=0
            yuanyin=['a', 'e', 'i', 'o', 'u']
            ans=0
            while j<len(s):
                if s[j] in yuanyin:
                    res+=1
                    ans=max(ans,res)
                if j-i+1>=k:
                    if s[i] in yuanyin:
                        res-=1
                        ans=max(ans,res)
                    i+=1
                j+=1
            return ans
    

    相关文章:

  • ESP32(2)WIFI链接
  • 天梯赛 L2-004 这是二叉搜索树吗?
  • C#设计模式Demo——MVC
  • matlab中如何集成使用python
  • 文捕---博客文章下载工具
  • AI入门7:python三种API方式调用本地Ollama+DeepSeek
  • bak 文件
  • 深海300米的低温环境中的BMS优化方法
  • STM32---FreeRTOS事件标志组
  • openEuler24.03 LTS下安装MySQL8
  • dfs(十二)21. 合并两个有序链表 递归解决
  • Spring 框架中常用注解和使用方法
  • 如何管理需求变更
  • 做游戏的发展方向
  • Skyeye 云智能制造办公系统 VUE 版本 v3.15.13 发布
  • ChatGPT and Claude国内使用站点
  • CareUEyes护眼软件深度解析:为你的双眼保驾护航
  • 基于Gemini 生成 Gemini Embedding
  • 学习笔记之注册用户如何防止缓存穿透
  • 365天之第P10周:Pytorch实现车牌识别
  • 受天气等影响SC8041航班三次备降延误超12小时,山航致歉
  • “网约摩托”在部分县城上线:起步价五六元,专家建议纳入监管
  • 过去24小时中美是否就关税问题进行过接触?外交部:没有
  • 2025年“投资新余•上海行”钢铁产业“双招双引”推介会成功举行
  • 气候资讯|4月全球前沿气候科学研究&极端天气气候事件
  • 中国防疫队深入缅甸安置点开展灾后卫生防疫工作