大數據

算法筆試模擬題精解之“相似數組”

在線編程產品介紹

阿里雲開發者社區在線編程產品,針對廣大開發者學習、實踐、面試、應聘、考試認證等打造的免費在線刷題神器。題庫來自筆試模擬題、算法大賽模擬題等,界面整潔明瞭,操作簡單,為用戶營造專心答題的學習環境。
點擊鏈接開始體驗:https://developer.aliyun.com/coding

題目描述

查看題目:77.相似數組 現在有兩個數組 a 和 b ,長度分別為 n 和 m。你可以對兩者進行任意次數(包括零次)的下述操作:

任選一段連續的區間[l, r],將其替換為這段區間的所有數字的和。比如,對於[1, 3, 4, 5, 11, 9],你可以選擇區間[3, 5],並將其替換為4+5+11=20,操作後的數組為[1, 3, 20, 9]。

你現在需要通過上述操作將兩個數組變成相同的數組,相同的定義是:對於兩個數組 a,b 必須長度相同,不妨設為l,並且對於 1 <= i <= l,必有a[i]=b[i]。

如果這兩個數組可以變成相同的數組,那麼我們稱這兩個數組是相似數組,否則不是相似數組。我們並不在意操作的次數,我們只在意在這兩個數組經過操作之後變成相同數組的時候最長的長度是多少,如果它們本來不相似請輸出-1。

輸入內容為四個部分,先兩個數字n、m(1 <= n, m <= 100000),分別表示數組a和b的長度,再分別輸入含有n個數字的數組a和含有m個數字的數組b,其中 1 <= a[i], b[i] <= 1000000000。

輸出一個數字,表示最長的長度。

示例1
輸入:
5
4
[7,2,5, 11, 13]
[9 ,16 ,6 ,7 ]
輸出:
3

解題思路

要解出相似數組的最長長度,即要求相似數組中的每個元素儘可能的小,把握這一點,結合下來的算法過程理解一下。

設兩個指針,分別指向數組a和b的第一個位置(即i=0,j=0),定義兩個變量,分別表示數組a和b的當前區別的和(sum_a=a[0], sum_b=b[0]),然後遍歷數組。

如果sum_a==sum_b:
則結果加1(即ans++),然後對兩個指針分別加1(i++, j++)。

判斷:如果兩個指針都等於各自數組的長度(即i==n&&j==m),則返回結果(return ans);
如果兩個指針僅有一個等於數組的長度(即i=n || j=m),則返回-1(表示不是相似數組);
如果以上兩個條件都不滿足(即兩個指針都小於數組長度),則當前區間和更新為此時指向的元素(即sum_a=a[i], sum_b=b[j])。

如果sum_a則數組a的指針向前移動(即i++),判斷i是否越界(即i==n為真表示越界),如果越界,那麼返回-1(表示不是相似數組),

如果沒越界,給區別和加上當前元素(即sum_a+a[i])

如果sum_a>sum_b:
則數組b的指針向前移動(即j++),判斷j是否越界(即j==m為真表示越界),如果越界,那麼返回-1(表示不是相似數組),
如果沒越界,給區別和加上當前元素(即sum_b+a[b])
重複以上過程,即可求解。

是不是有思路了呢,點擊鏈接立刻答題:77.相似數組

另有在線編程3月份比賽正式開啟!機械鍵盤等你拿!

340-130-3.png

Leave a Reply

Your email address will not be published. Required fields are marked *