【NOWCODE SEVEN】:二分查找/排序
🤵Author:今日說“法”
🏆主攻領(lǐng)域:算法分析與設(shè)計(jì)
📰個人主頁:今日說"法"的博客
📝系列專欄:NOWCODE系列
??前言
? ? ? ? 一位大佬曾經(jīng)說過:程序=數(shù)據(jù)結(jié)構(gòu)+算法??,數(shù)據(jù)結(jié)構(gòu)相當(dāng)于一套普遍適用的工具,算法相當(dāng)于一套行之有效的解題方法和解題步驟。Dambisa Moyo 曾經(jīng)說過:“種一顆樹最好的時間是十年前,其次是現(xiàn)在。”所以十年前沒有刷題的朋友,現(xiàn)在跟著博主一起刷題吧。
工具介紹:數(shù)組
定義
數(shù)組(Array)是一種線性表數(shù)據(jù)結(jié)構(gòu)。它用一組連續(xù)的內(nèi)存空間,來存儲一組具有相同類型的數(shù)據(jù)。
結(jié)構(gòu)
數(shù)組=一塊連續(xù)的存儲空間,我們假想數(shù)據(jù)下方有下標(biāo)
?
優(yōu)缺點(diǎn)
優(yōu)點(diǎn):查詢/查找/檢索其個下際上的元素時效事極高。可以說是查詢效事最高的一個數(shù)據(jù)結(jié)構(gòu)。
為什么檢索效事高?
第一:每一個元素的內(nèi)存地址在空間存儲上是連續(xù)的。
第二:每一個元素類型相同,所以占用空間大小一樣。
第三:知道第一個元素內(nèi)存地址,知道每一個元素占用空間的大小,又知道下標(biāo),所以通過一個數(shù)學(xué)表達(dá)式就可以計(jì)算出某個下標(biāo)上元素的內(nèi)存地址。直接通過內(nèi)存地址定位元素,所以數(shù)組的檢索效事是最高的。
數(shù)組中存儲100個元責(zé),或者存結(jié)100萬個元素,在元素查詢/檢索方面,效事是相同的。因?yàn)閿?shù)組中元責(zé)查找的時候不會一個一個找,是通過數(shù)學(xué)表達(dá)式計(jì)算出來的。(算出一個內(nèi)存地址,隨接定位的。)
缺點(diǎn):
第一:由于為了保證數(shù)組中每個元素的內(nèi)存的加連續(xù),所以在數(shù)組上隨機(jī)制除或者增加元素的時候效事較紙,因?yàn)殡S機(jī)增別元責(zé)會涉及到后面元素統(tǒng)一向前或者向后位移的操作。
第二:數(shù)組不能存能大數(shù)據(jù)最,為什么?
因?yàn)楹茈y在內(nèi)存空間上找到一塊特別大的連續(xù)的內(nèi)存空間。
注意:對于數(shù)組中最后一個元素的增別,是沒有效事影啊的。
CODE Exercise:
One:二分查找-I
難度:????
時間限制:1秒
空間限制:256M
?
描述
請實(shí)現(xiàn)無重復(fù)數(shù)字的升序數(shù)組的二分查找
給定一個 元素升序的、無重復(fù)數(shù)字的整型數(shù)組 nums?和一個目標(biāo)值 target?,寫一個函數(shù)搜索 nums?中的 target,如果目標(biāo)值存在返回下標(biāo)(下標(biāo)從 0 開始),否則返回 -1
數(shù)據(jù)范圍:0≤len(nums)≤2×10^5?,?數(shù)組中任意值滿足 ∣val∣≤109
進(jìn)階:時間復(fù)雜度 (logn)?,空間復(fù)雜度 O(1)
示例1
輸入:[-1,0,3,4,6,10,13,14],13
返回值:6
說明:13 出現(xiàn)在nums中并且下標(biāo)為 6
示例2
輸入:[],3
返回值:-1
說明:nums為空,返回-1
示例3
輸入:[-1,0,3,4,6,10,13,14],2
返回值:-1
說明:2 不存在nums中因此返回 -1
備注:
數(shù)組元素長度在[0,10000]之間
數(shù)組每個元素都在?[-9999, 9999]之間。
Submit(python)
?
class Solution:def search(self , nums: List[int], target: int) -> int:# write code hereif len(nums)==0:return -1lenth_low=0lenth_high=len(nums)-1lenth_haf=(lenth_low+lenth_high)//2while lenth_low<=lenth_high:lenth_haf=(lenth_low+lenth_high)//2if target==nums[lenth_haf]:return lenth_hafif target>nums[lenth_haf]:lenth_low=lenth_haf+1if target<nums[lenth_haf]:lenth_high=lenth_haf-1return -1Two:?二維數(shù)組中的查找
難度:??????
時間限制:1秒
空間限制:256M?
描述
在一個二維數(shù)組array中(每個一維數(shù)組的長度相同),每一行都按照從左到右遞增的順序排序,每一列都按照從上到下遞增的順序排序。請完成一個函數(shù),輸入這樣的一個二維數(shù)組和一個整數(shù),判斷數(shù)組中是否含有該整數(shù)。
[
[1,2,8,9],
[2,4,9,12],
[4,7,10,13],
[6,8,11,15]
]
給定 target?= 7,返回?true。
給定?target?=?3,返回?false。
數(shù)據(jù)范圍:矩陣的長寬滿足5?0≤n,m≤500?, 矩陣中的值滿足 0≤val≤10^9
進(jìn)階:空間復(fù)雜度?O(1) ,時間復(fù)雜度?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()查找數(shù)組中每一行的元素# 用len()取得行數(shù)for i in range(len(array)):if array[i].count(target):return True return False?
Three:?尋找峰值
難度:??????
時間限制:1秒
空間限制:256M
描述
給定一個長度為n的數(shù)組nums,請你找到峰值并返回其索引。數(shù)組可能包含多個峰值,在這種情況下,返回任何一個所在位置即可。
1.峰值元素是指其值嚴(yán)格大于左右相鄰值的元素。嚴(yán)格大于即不能有等于
2.假設(shè)?nums[-1] = nums[n] =?∞
3.對于所有有效的 i 都有 nums[i] != nums[i + 1]
4.你可以使用O(logN)的時間復(fù)雜度實(shí)現(xiàn)此問題嗎?
?
如輸入[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 herefor i in range(1,len(nums)-1):if nums[i]>nums[i-1] and nums[i]>nums[i+1]:return iif max(nums)==nums[-1]:return len(nums) -1elif max(nums) == nums[0]:return 0🔥結(jié)語
? ? ? ? ???冰凍三尺非一日之寒??,只刷一兩天刷法可成不了編程界的耶路撒冷,千里之行始于足下,所以還是得堅(jiān)持刷題阿,每天記得要上機(jī)喲!!!
總結(jié)
以上是生活随笔為你收集整理的【NOWCODE SEVEN】:二分查找/排序的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 麻将牌和牌问题
- 下一篇: 一文读懂链上身份(DID):赛道及项目一