翻轉陣列,來自賽碼網,初級演算法

2021-08-08 18:13:01 字數 1626 閱讀 4181

翻轉陣列

題目描述

給定乙個長度為n的整數陣列a,元素均不相同,問陣列是否存在這樣乙個片段,只將該片段翻轉就可以使整個陣列公升序排列。其中陣列片段[l,r]表示序列a[l], a[l+1], ..., a[r]。原始陣列為

a[1], a[2], ..., a[l-2], a[l-1], a[l], a[l+1], ..., a[r-1], a[r], a[r+1], a[r+2], ..., a[n-1], a[n],

將片段[l,r]反序後的陣列是

a[1], a[2], ..., a[l-2], a[l-1], a[r], a[r-1], ..., a[l+1], a[l], a[r+1], a[r+2], ..., a[n-1], a[n]。

輸入第一行資料是乙個整數:n (1≤n≤105),表示陣列長度。

第二行資料是n個整數a[1], a[2], ..., a[n] (1≤a[i]≤109)。

樣例輸入

42 1 3 4

輸出輸出「yes」,如果存在;否則輸出「no」,不用輸出引號。

樣例輸出

yes時間限制

c/c++語言:1000ms其它語言:3000ms

記憶體限制

c/c++語言:65536kb其它語言:589824kb

原理很簡單,時間複雜度為n,只進行一次迴圈(分三段進行)。按照題意,第一段為增序,第二段為減序,第三段為增序,三個迴圈滿足這三個條件即可。最後判斷三段迴圈完成後工作標記i是否到達陣列末端,是則輸出「yes」,否則輸出「no」。額外的,我們需要判斷開始出現減序時的第乙個數是否小於第三段中開始出現增序時的第乙個數,不滿足則輸出「no」。

#includeusing namespace std;

int main()

int i; //i表示現正在讀取陣列中的第i個數;

for(i = 1; get[i] >= get[i - 1] && i < n; i++ ) {} //開始迴圈,從0開始,直到發現第i個數小於第i-1個數停止;1 2 5 4(i) 3 6 7 8;

int flag = i - 1; //設定旗幟,儲存第i-1個數,也就是開始出現降序時的第乙個數,置換後它會與又重新出現公升序時的第乙個數(x)進行比較,小於或者等於x才有可能滿足題意;1 2 5(flag) 4(i) 3 6 7 8;

for(; get[i] <= get[i - 1] && i < n; i++) {} //繼續迴圈,從第i個數開始,直到發現第i個數大於第i-1個數停止;1 2 5(flag) 4 3 6(i) 7 8;

if(get[flag] > get[i])

for(; get[i] >= get[i - 1] && i < n; i++ ) {} //繼續迴圈,從第i個數開始,直到不滿足增序條件為止;1 2 5(flag) 4 3 6 7 8 x(i);

if(i == n) cout << "yes" << endl; //如果i==n,也就是上一行迴圈進行到了最後,說明之後資料全滿足增序條件,則返回」yes「;

else cout << "no" << endl; //否則返回」no「;

return 1;

}

賽碼 翻轉陣列

題目描述 給定乙個長度為n的整數陣列a,元素均不相同,問陣列是否存在這樣乙個片段,只將該片段翻轉就可以使整個陣列公升序排列。其中陣列片段 l,r 表示序列a l a l 1 a r 原始陣列為 a 1 a 2 a l 2 a l 1 a l a l 1 a r 1 a r a r 1 a r 2 a...

LeetCode初級演算法 陣列 旋轉陣列

以下是本人的c 演算法學習筆記,記錄在部落格上以供自己隨時查閱 題目描述 給定乙個陣列,將陣列中的元素向右移動 k 個位置,其中 k 是非負數 盡可能想出更多的解決方案,至少有三種不同的方法可以解決這個問題。要求使用空間複雜度為 o 1 的原地演算法。我先在vs2017上整體實現該功能,再將關鍵 在...

1 初級演算法題 旋轉陣列

題目 給定乙個陣列,將陣列中的元素向右移動n個位置,其中n是非負數。輸入 1,2,3,4,5,6,7 和n 3 輸出 5,6,7,1,2,3,4 向右旋轉1步 7,1,2,3,4,5,6 向右旋轉2步 6,7,1,2,3,4,5 向右旋轉3步 5,6,7,1,2,3,4 假設,給定陣列 8,7,6,...