目录
一、存储方式
二、二分查找
四、数组操作:滑动窗口
视频讲解地址:动态-哔哩哔哩
一、存储方式
在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),效率远超线性查找
python">class Solution:def search(self, nums: List[int], target: int) -> int:left, right = 0, len(nums) - 1while left <= right:mid = (left + right) // 2if 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
python">class Solution:def search(self, nums: List[int], target: int) -> int:i, j = 0, len(nums) - 1while i <= j:m = (i + j) // 2if nums[m] < target: i = m + 1elif nums[m] > target: j = m - 1else: return mreturn -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]
python">class Solution:def sortedSquares(self, nums: List[int]) -> List[int]:l, r, i = 0, len(nums)-1, len(nums)-1res = [float('inf')] * len(nums) # 需要提前定义列表,存放结果while l <= r:if nums[l] ** 2 < nums[r] ** 2: # 左右边界进行对比,找出最大值res[i] = nums[r] ** 2r -= 1 # 右指针往左移动else:res[i] = nums[l] ** 2l += 1 # 左指针往右移动i -= 1 # 存放结果的指针需要往前平移一位return res
四、数组操作:滑动窗口
- 1456. 定长子串中元音的最大数目 1263
给你字符串 s
和整数 k
。
请返回字符串 s
中长度为 k
的单个子字符串中可能包含的最大元音字母数。
英文中的 元音字母 为(a
, e
, i
, o
, u
)。
示例 1:
输入:s = "abciiidef", k = 3 输出:3 解释:子字符串 "iii" 包含 3 个元音字母。
示例 2:
输入:s = "aeiou", k = 2 输出:2 解释:任意长度为 2 的子字符串都包含 2 个元音字母。
python">class Solution:def maxVowels(self, s: str, k: int) -> int:i,j=0,0res=0yuanyin=['a', 'e', 'i', 'o', 'u']ans=0while j<len(s):if s[j] in yuanyin:res+=1ans=max(ans,res)if j-i+1>=k:if s[i] in yuanyin:res-=1ans=max(ans,res)i+=1j+=1return ans