日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問(wèn) 生活随笔!

生活随笔

當(dāng)前位置: 首頁(yè) > 编程资源 > 编程问答 >内容正文

编程问答

算法(3)--leetcode-explore-learn-数据结构-数组1

發(fā)布時(shí)間:2023/12/13 编程问答 21 豆豆
生活随笔 收集整理的這篇文章主要介紹了 算法(3)--leetcode-explore-learn-数据结构-数组1 小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

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=0i?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+1n?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]

class Solution(object):def pivotIndex(self, nums):""":type nums: List[int]:rtype: int"""n=len(nums)if n==0:return -1left_sum=[0]*(n)right_sum=[0]*(n)for i in range(1,n):left_sum[i]=left_sum[i-1]+nums[i-1]for i in range(n-2,-1,-1):right_sum[i]=right_sum[i+1]+nums[i+1]print (left_sum,right_sum)for i in range(n):if left_sum[i]==right_sum[i]:return ireturn -1

2.2 至少是其他數(shù)字兩倍大的最大數(shù)

在一個(gè)給定的數(shù)組nums中,總是存在一個(gè)最大元素 。
查找數(shù)組中的最大元素是否至少是數(shù)組中每個(gè)其他數(shù)字的兩倍。
如果是,則返回最大元素的索引,否則返回-1。

思路:
一次搜索,找最大值
二次搜索,判斷是否符合兩倍條件

class Solution(object):def dominantIndex(self, nums):""":type nums: List[int]:rtype: int"""n=len(nums)max_num=float("-INF")max_ind=-1for i in range(n):if nums[i]>max_num:max_num=nums[i]max_ind=ifor i in range(n):if i ==max_ind:continue# 判斷是否是nums[i]的兩倍if max_num<nums[i]*2:return -1return max_ind

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)題。

如果覺(jué)得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。