🤵Author:今日说“法”
🏆主攻领域:算法分析与设计
📰个人主页:今日说"法"的博客
📝系列专栏:NOWCODE系列
⚡️前言
一位大佬曾经说过:程序=数据结构+算法 ,数据结构相当于一套普遍适用的工具,算法相当于一套行之有效的解题方法和解题步骤。Dambisa Moyo 曾经说过:“种一颗树最好的时间是十年前,其次是现在。”所以十年前没有刷题的朋友,现在跟着博主一起刷题吧。
工具介绍:数组
定义
数组(Array)是一种线性表数据结构。它用一组连续的内存空间,来存储一组具有相同类型的数据。
结构
数组=一块连续的存储空间,我们假想数据下方有下标
优缺点
优点:查询/查找/检索其个下际上的元素时效事极高。可以说是查询效事最高的一个数据结构。
为什么检索效事高?
第一:每一个元素的内存地址在空间存储上是连续的。
第二:每一个元素类型相同,所以占用空间大小一样。
第三:知道第一个元素内存地址,知道每一个元素占用空间的大小,又知道下标,所以通过一个数学表达式就可以计算出某个下标上元素的内存地址。直接通过内存地址定位元素,所以数组的检索效事是最高的。
数组中存储100个元责,或者存结100万个元素,在元素查询/检索方面,效事是相同的。因为数组中元责查找的时候不会一个一个找,是通过数学表达式计算出来的。(算出一个内存地址,随接定位的。)
缺点:
第一:由于为了保证数组中每个元素的内存的加连续,所以在数组上随机制除或者增加元素的时候效事较纸,因为随机增别元责会涉及到后面元素统一向前或者向后位移的操作。
第二:数组不能存能大数据最,为什么?
因为很难在内存空间上找到一块特别大的连续的内存空间。
注意:对于数组中最后一个元素的增别,是没有效事影啊的。
CODE Exercise:
One:二分查找-I
难度:⭐⭐⭐
时间限制:1秒
空间限制:256M
描述
请实现无重复数字的升序数组的二分查找
给定一个 元素升序的、无重复数字的整型数组 nums 和一个目标值 target ,写一个函数搜索 nums 中的 target,如果目标值存在返回下标(下标从 0 开始),否则返回 -1
数据范围:0≤len(nums)≤2×10^5 , 数组中任意值满足 ∣val∣≤109
进阶:时间复杂度 (logn) ,空间复杂度 O(1)
示例1
输入:[-1,0,3,4,6,10,13,14],13
返回值:6
说明:13 出现在nums中并且下标为 6
示例2
输入:[],3
返回值:-1
说明:nums为空,返回-1
示例3
输入:[-1,0,3,4,6,10,13,14],2
返回值:-1
说明:2 不存在nums中因此返回 -1
备注:
数组元素长度在[0,10000]之间
数组每个元素都在 [-9999, 9999]之间。
Submit(python)
class Solution:
def search(self , nums: List[int], target: int) -> int:
# write code here
if len(nums)==0:
return -1
lenth_low=0
lenth_high=len(nums)-1
lenth_haf=(lenth_low+lenth_high)//2
while lenth_low<=lenth_high:
lenth_haf=(lenth_low+lenth_high)//2
if target==nums[lenth_haf]:
return lenth_haf
if target>nums[lenth_haf]:
lenth_low=lenth_haf+1
if target<nums[lenth_haf]:
lenth_high=lenth_haf-1
return -1
Two: 二维数组中的查找
难度:⭐⭐⭐ ⭐
时间限制:1秒
空间限制:256M
描述
在一个二维数组array中(每个一维数组的长度相同),每一行都按照从左到右递增的顺序排序,每一列都按照从上到下递增的顺序排序。请完成一个函数,输入这样的一个二维数组和一个整数,判断数组中是否含有该整数。
[
[1,2,8,9],
[2,4,9,12],
[4,7,10,13],
[6,8,11,15]
]
给定 target = 7,返回 true。
给定 target = 3,返回 false。
数据范围:矩阵的长宽满足5 0≤n,m≤500 , 矩阵中的值满足 0≤val≤10^9
进阶:空间复杂度 O(1) ,时间复杂度 O(n+m)
示例1
输入:7,[[1,2,8,9],[2,4,9,12],[4,7,10,13],[6,8,11,15]]
返回值:true
说明:存在7,返回true
示例2
输入:1,[[2]]
返回值:false
示例3
输入:3,[[1,2,8,9],[2,4,9,12],[4,7,10,13],[6,8,11,15]]
返回值:false
说明:不存在3,返回false
Submit(python)
class Solution:
def Find(self , target: int, array: List[List[int]]) -> bool:
# 利用list.count()查找数组中每一行的元素
# 用len()取得行数
for i in range(len(array)):
if array[i].count(target):
return True
return False
Three: 寻找峰值
难度:⭐⭐⭐ ⭐
时间限制:1秒
空间限制:256M
描述
给定一个长度为n的数组nums,请你找到峰值并返回其索引。数组可能包含多个峰值,在这种情况下,返回任何一个所在位置即可。
1.峰值元素是指其值严格大于左右相邻值的元素。严格大于即不能有等于
2.假设 nums[-1] = nums[n] =−∞
3.对于所有有效的 i 都有 nums[i] != nums[i + 1]
4.你可以使用O(logN)的时间复杂度实现此问题吗?
如输入[2,4,1,2,7,8,4]时,会形成两个山峰,一个是索引为1,峰值为4的山峰,另一个是索引为5,峰值为8的山峰,如下图所示:
示例1
输入:[2,4,1,2,7,8,4]
返回值:1
说明:4和8都是峰值元素,返回4的索引1或者8的索引5都可以
示例2
输入:[1,2,3,1]
返回值:2
说明:3 是峰值元素,返回其索引 2
Submit(python)
class Solution:
def findPeakElement(self , nums: List[int]) -> int:
# write code here
for i in range(1,len(nums)-1):
if nums[i]>nums[i-1] and nums[i]>nums[i+1]:
return i
if max(nums)==nums[-1]:
return len(nums) -1
elif max(nums) == nums[0]:
return 0
🔥结语
❄️ 冰冻三尺非一日之寒❄️,只刷一两天刷法可成不了编程界的耶路撒冷,千里之行始于足下,所以还是得坚持刷题阿,每天记得要上机哟!!!