文心一言 VS 訊飛星火 VS chatgpt (18)-- 算法導(dǎo)論4.1 5題
五、使用如下思想為最大子數(shù)組問題設(shè)計(jì)一個(gè)非遞歸的、線性時(shí)間的算法。從數(shù)組的左邊界開始,由左至右處理,記錄到目前為止已經(jīng)處理過的最大子數(shù)組。若已知 A[1..j]門的最大子數(shù)組,基于如下性質(zhì)將解擴(kuò)展為 A[1..j+1]的最大子數(shù)組:A[1..j+1]的最大子數(shù)組要么是A[1..j]的最大子數(shù)組,要么是某個(gè)子數(shù)組 Ai..j+1。在已知A[1..j]的最大子數(shù)組的情況下,可以在線性時(shí)間內(nèi)找出形如 A[i..j+1]的最大子數(shù)組。
文心一言:
最大子數(shù)組問題是一種經(jīng)典的算法問題,可以使用非遞歸的方法來解決。具體來說,我們可以使用一個(gè)隊(duì)列來存儲(chǔ)當(dāng)前已經(jīng)處理過的最大子數(shù)組,并且維護(hù)一個(gè)變量 max_len 來記錄當(dāng)前最大子數(shù)組的長(zhǎng)度。同時(shí),我們可以遍歷整個(gè)數(shù)組,記錄當(dāng)前已經(jīng)處理過的最大子數(shù)組的長(zhǎng)度,并且在遍歷的過程中更新 max_len。
具體來說,我們可以使用一個(gè)變量 cur_len 來記錄當(dāng)前已經(jīng)處理過的最大子數(shù)組的長(zhǎng)度,每當(dāng)遍歷到一個(gè)新的子數(shù)組時(shí),我們可以將其長(zhǎng)度加入到 cur_len 中,并且更新 max_len。同時(shí),我們可以使用一個(gè)變量 cur_start 來記錄當(dāng)前已經(jīng)處理過的最大子數(shù)組的起始位置,每當(dāng)遍歷到一個(gè)新的子數(shù)組時(shí),我們可以將其起始位置加入到 cur_start 中,并且更新 cur_len。
最后,我們可以返回 cur_start,它是 max_len。這個(gè)值就是最大子數(shù)組中起始位置最右邊的元素的下標(biāo),我們可以用它來解決最大子數(shù)組問題。
下面是一個(gè)使用 Python 實(shí)現(xiàn)的非遞歸的最大子數(shù)組問題的算法:
def?maxSubArray(nums):??
????max_len?=?0??
????cur_start?=?0??
????cur_len?=?0??
????queue?=?[]??
????for?i?in?range(len(nums)):??
????????if?cur_len?==?max_len:??
????????????return?-1??
????????if?nums[i]?>?nums[cur_start]:??
????????????cur_len?+=?nums[i]?-?nums[cur_start]??
????????????cur_start?=?i??
????????if?i?>?cur_start:??
????????????cur_len?-=?nums[i?-?cur_start]??
????????????cur_start?=?i??
????????queue.append(cur_start)??
????????cur_start?+=?nums[i]??
????if?cur_len?==?max_len:??
????????return?-1??
????return?queue
這個(gè)算法的時(shí)間復(fù)雜度為 O(n),其中 n 是數(shù)組 nums 的長(zhǎng)度。


訊飛星火:
算法步驟:
1.初始化最大子數(shù)組為整個(gè)數(shù)組的第一個(gè)元素。
2.從左至右遍歷數(shù)組,每次比較當(dāng)前元素與最大子數(shù)組的末尾元素的大小關(guān)系,如果當(dāng)前元素大于最大子數(shù)組的末尾元素,則將最大子數(shù)組的末尾元素更新為當(dāng)前元素。
3.如果遍歷到數(shù)組的末尾,仍然沒有找到比最大子數(shù)組更大的末尾元素,則最大子數(shù)組就是整個(gè)數(shù)組。
4.如果遍歷到某個(gè)位置i時(shí),發(fā)現(xiàn)A[i]大于等于最大子數(shù)組的末尾元素,并且A[i+1]也大于等于最大子數(shù)組的末尾元素,則可以將最大子數(shù)組擴(kuò)展到A[i]..A[j+1],其中j+1即為擴(kuò)展后的最大子數(shù)組的長(zhǎng)度。
5.如果遍歷完數(shù)組后仍未找到可以擴(kuò)展的最大子數(shù)組,則返回最大子數(shù)組。
時(shí)間復(fù)雜度為O(n),空間復(fù)雜度為O(1)。

chatgpt:
基于上述性質(zhì),可以設(shè)計(jì)一個(gè)非遞歸的、線性時(shí)間的算法來解決最大子數(shù)組問題。算法的主要思路如下:
1.?首先初始化兩個(gè)變量:max_so_far和max_ending_here。它們都初始化為第一個(gè)元素。
2.?然后從第二個(gè)元素開始遍歷整個(gè)數(shù)組。對(duì)于每個(gè)元素,更新max_ending_here = max(A[i], max_ending_here + A[i]),表示包含A[i]的最大子數(shù)組。同時(shí)更新max_so_far,表示到目前位置的最大子數(shù)組。
3.?如果max_ending_here小于0,則說明當(dāng)前處理的子數(shù)組已經(jīng)不是最大子數(shù)組中的一部分了,需要從下一個(gè)元素重新開始計(jì)算新的子數(shù)組。
4.?在遍歷過程中,記錄下max_so_far,即可得到整個(gè)數(shù)組的最大子數(shù)組。
該算法的時(shí)間復(fù)雜度為O(n),其中n為數(shù)組的長(zhǎng)度,因?yàn)橹恍枰淮伪闅v數(shù)組即可找到最大子數(shù)組。而空間復(fù)雜度為O(1),因?yàn)橹恍枰?shù)級(jí)別的額外空間來存儲(chǔ)變量。下面是該算法的Go語言實(shí)現(xiàn)示例:
func?maxSubArray(nums?[]int)?int?{
????if?len(nums)?==?0?{
????????return?0
????}
????maxSoFar?:=?nums[0]
????maxEndingHere?:=?nums[0]
????for?i?:=?1;?i?<?len(nums);?i++?{
????????maxEndingHere?=?max(nums[i],?maxEndingHere+nums[i])
????????maxSoFar?=?max(maxSoFar,?maxEndingHere)
????}
????return?maxSoFar
}
func?max(a,?b?int)?int?{
????if?a?>?b?{
????????return?a
????}
????return?b
}
其中max函數(shù)用來比較兩個(gè)數(shù)的大小,返回較大的那個(gè)數(shù)。


福大大架構(gòu)師每日一題
java當(dāng)死,golang當(dāng)立。最新面試題,涉及golang,rust,mysql,redis,云原生,算法,分布式,網(wǎng)絡(luò),操作系統(tǒng)。
公眾號(hào)