算法(3)--leetcode-explore-learn-数据结构-数组1
leetcode-explore-learn-數(shù)據(jù)結(jié)構(gòu)-數(shù)組1
- 1.簡(jiǎn)述
- 2.例題
- 2.1 尋找數(shù)組的中心索引
- 2.2 至少是其他數(shù)字兩倍大的最大數(shù)
- 2.3 加一
本系列博文為leetcode-explore-learn子欄目學(xué)習(xí)筆記,如有不詳之處,請(qǐng)參考leetcode官網(wǎng):https://leetcode-cn.com/explore/learn/card/array-and-string/198/introduction-to-array/768/
1.簡(jiǎn)述
數(shù)組是一種最基本的數(shù)據(jù)結(jié)構(gòu),用于按順序存儲(chǔ)數(shù)據(jù)。數(shù)組中元素通過(guò)索引來(lái)實(shí)現(xiàn)讀寫(xiě)操作。
數(shù)組有一個(gè)或多個(gè)維度,本文主要記錄一維數(shù)組及其相關(guān)例題
一般編程語(yǔ)言中,數(shù)組具有固定容量,需要在初始化的時(shí)候確定數(shù)組大小,后續(xù)無(wú)法修改其長(zhǎng)度。操作不是十分便利,于是大多編程語(yǔ)言提供了動(dòng)態(tài)數(shù)組的數(shù)據(jù)結(jié)構(gòu),其大小可變。
But在Python中就沒(méi)這么復(fù)雜,一個(gè)list數(shù)據(jù)結(jié)構(gòu)就可以滿足許多需求,其中包括數(shù)組和動(dòng)態(tài)數(shù)組。
2.例題
2.1 尋找數(shù)組的中心索引
給定一個(gè)整數(shù)類(lèi)型的數(shù)組,編程實(shí)現(xiàn)返回?cái)?shù)組的中心索引。
中心索引的定義:中心索引左側(cè)所有元素的和大于右側(cè)所有元素的和。
特殊情況:如果中心索引不存在,返回-1;
如果存在多個(gè)中心所以,返回最左邊的一個(gè)
思路:定義兩個(gè)數(shù)組:
left_sum[i]=∑j=0i?1nums[j],i=1,2,3,...,n?1left\_sum[i]=\sum_{j=0}^{i-1}nums[j],\ \ i=1,2,3,...,n-1left_sum[i]=j=0∑i?1?nums[j],??i=1,2,3,...,n?1
right_sum[i]=∑j=i+1n?1nums[j],i=n?2,n?3,...,0right\_sum[i]=\sum_{j=i+1}^{n-1}nums[j], \ \ i=n-2,n-3,...,0 right_sum[i]=j=i+1∑n?1?nums[j],??i=n?2,n?3,...,0
逐個(gè)比較left_sum與right_sum的元素,如果相同則返回對(duì)應(yīng)索引,如果遍歷完也沒(méi)有相同的,則返回-1
例子:nums = [1, 7, 3, 6, 5, 6]
[0,1,27]
[1,7,20]
[8,3,17]
[11,6,11]
[17,5,6]
[22,6,0]
left_sum=[0,1,8,11,17,22]
right_sum=[27,20,17,11,6,0]
2.2 至少是其他數(shù)字兩倍大的最大數(shù)
在一個(gè)給定的數(shù)組nums中,總是存在一個(gè)最大元素 。
查找數(shù)組中的最大元素是否至少是數(shù)組中每個(gè)其他數(shù)字的兩倍。
如果是,則返回最大元素的索引,否則返回-1。
思路:
一次搜索,找最大值
二次搜索,判斷是否符合兩倍條件
2.3 加一
給定一個(gè)由整數(shù)組成的非空數(shù)組所表示的非負(fù)整數(shù),在該數(shù)的基礎(chǔ)上加一。
最高位數(shù)字存放在數(shù)組的首位, 數(shù)組中每個(gè)元素只存儲(chǔ)單個(gè)數(shù)字。
你可以假設(shè)除了整數(shù) 0 之外,這個(gè)整數(shù)不會(huì)以零開(kāi)頭。
核心難點(diǎn):有進(jìn)位的情況該如何處理,因?yàn)槭羌右徊僮?#xff0c;大大簡(jiǎn)化了進(jìn)位難度,因?yàn)橹挥锌赡墚a(chǎn)生的進(jìn)位是1
思路1在這里插入代碼片:直接在數(shù)組上操作,判斷數(shù)組每位置數(shù)字是否產(chǎn)生進(jìn)位:
class Solution(object):def plusOne(self, digits):""":type digits: List[int]:rtype: List[int]"""n=len(digits)digits[n-1]+=1# 判斷進(jìn)位,如何存儲(chǔ)進(jìn)位信息。flag=0for i in range(n-1,-1,-1):if flag==1:digits[i]+=1flag=0if digits[i]==10:digits[i]=0flag=1if flag!=0:res=[flag]for i in range(n):res.append(digits[i])return resreturn digits思路2:數(shù)組轉(zhuǎn)數(shù)字,數(shù)字+1處理,再轉(zhuǎn)數(shù)組。
def plusOne(self, digits):""":type digits: List[int]:rtype: List[int]"""# 整數(shù)轉(zhuǎn)數(shù)字,加一之后轉(zhuǎn)會(huì)數(shù)組n=len(digits)nums=0e=0for i in range(n-1,-1,-1):nums+=digits[i]*10**ee+=1nums+=1res=[]while(nums>0):digit=nums%10res.append(digit)nums=(nums-digit)/10res.reverse()return res總結(jié)
以上是生活随笔為你收集整理的算法(3)--leetcode-explore-learn-数据结构-数组1的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: Tail Recursion尾递归
- 下一篇: tests