初夏小談 NC 排序子串行問題

2021-09-19 12:58:59 字數 2764 閱讀 1063

問題:1. 牛牛定義排序子串行為乙個陣列中一段連續的子串行, 並且這段子序列是非遞增或者非遞減排序的。牛牛有乙個長度為n的整數陣列a, 他現在有乙個任務是把陣列a分為若干段排序子串行, 牛牛想知道他最少可以把這個

陣列分為幾段排序子串行.

如樣例所示, 牛牛可以把陣列a劃分為[1, 2, 3]和[2, 2, 1]兩個排序子串行, 至少需要劃分為2個排序子串行, 所以輸出

2輸入描述:

輸入的第一行為乙個正整數n(1 ≤ n ≤ 10 ^ 5)

第二行包括n個整數a_i(1 ≤ a_i ≤ 10 ^ 9), 表示陣列a的每個數字。

輸出描述:

輸出乙個整數表示牛牛可以將a最少劃分為多少段排序子串行

示例1 :輸入6

1 2 3 2 2 1

輸出2

該題目意思就是在乙個陣列中找出最少的有序子串行數量。

這個題的思路是:(1)、由於找有序子串行的數量,所以他們的特點就是在這一子串行中全部都是遞增或者遞減的。,由此我們只要找到極大值或者極小值就能解決此問題。

(2)、極大值和極小值是通過正余弦函式影象來模擬過來的。因為相鄰的極值之間不是遞增就是遞減的。

(3)、最後找到極值的數量+1就是,求解的答案。為什麼+1呢,想一想如果有乙個極值的話是不是一段子串行是遞增的,一段子串行是遞減的。就是兩端有序子串行。

特殊情況:有可能在極值處不是乙個值而是好幾個值,它們都一樣大,這樣將如何解決?

有可能在開始就許多相等的資料,如何處理?

假如極值之間再也沒有資料的話,那麼子串行數量就不會像之前那樣計算

解決辦法:解決1:針對問題一,

第一步:可以標記第乙個相等資料的位置繼續往後找最後乙個相等的資料並且再次標記。然後再用標記的最後乙個來進行比較就ok了。資料都一樣大,之後在進行比較。

解決2:

開始時,如果資料重複就一直往下走,標記最後乙個資料,再進行比較。為判斷是否為極大值/極小值做鋪墊。

解決3:

在判斷相鄰極值之間是否有資料時,要用標記極大值的第乙個資料座標減去極小值的最後乙個標記資料的座標是否為1,或者標記極大值的最後乙個資料座標減標記極小值的第乙個資料的座標是否為-1.為1/-1就說明極值間沒有資料。此時就注意如果遇到兩次極值間都沒有資料就需要將子串行數減一。

特殊序列圖:

**實現:

#include#includeusing namespace std;

int disposedata(vector& v)

} //兩種特殊情況

//如果當前資料大於前面資料,而後面有一部分等於當前資料,

if (v[i] > v[i - 1] && v[i] == v[i + 1])

}//如果走完相等的資料,當前資料大於後面第乙個資料說明是極大值

if (i < v.size() - 1)

}} //如果當前資料小於前面資料,而後面有一部分等於當前資料,

if (v[i] < v[i - 1] && v[i] == v[i + 1])

}//如果走完相等的資料,當前資料小於後面第乙個資料說明是極大值

if (i < v.size() - 1)

}} //極小值

if (v[i] < v[i - 1] && v[i] < v[i + 1])

//極大值

if (v[i] > v[i - 1] && v[i] > v[i + 1])

//判斷極值之間有沒有資料

//每兩次num--;

if (maxfirstequal - minlastequal == 1 || maxlastequal - minfirstequal == -1)

}} //極值數量加1就是分割的資料數。

num++;

return num;

}int main()

int num = disposedata(v);

cout << "num = " << num << endl;

system("pause");

return 0;

}

執行結果

執行特殊情況:

特別注意:

1.在極值有多個相等的資料時,在往下走遇到最後乙個極值,判斷下乙個的大小時應當注意是否越界。否則程式崩潰。我在裡面踩坑滋味哈哈。

珍&原始碼

初夏小談 NK 兩種排序方法

考拉有n個字串字串,任意兩個字串長度都是不同的。考拉最近學習到有兩種字串的排序方法 1.根據字串的字典序排序。例如 car carriage cats doggies koala 2.根據字串的長度排序。例如 car cats koala doggies carriage 考拉想知道自己的這些字串排...

初夏小談 類和物件(一)

所以在c 中把處理問題的步驟進行包裝就形成了類。這個類可以處理特定的問題,而不用去關注它是怎麼一步步處理的。在c 中類用class來標識,struct也可以。類中不僅可以定義變數,還可以定義函式。例如 struct student void printstu 成員變數 char name 20 ch...

初夏小談 AI雲盤系統

解決由於經常將一些以前的檔案刪除,而現今或者以後可能用到的尷尬境地。ai雲盤系統功能具體可分為兩大塊 分別是客戶端和服務端兩大部分。客戶端與服務端通訊的協議是基於http協議。客戶端 1.首先獲取檔案的備份資訊記錄,目的是看看哪些檔案已經進行了備份,並將這些檔案的大小和修改資訊以鍵值對的形式儲存到u...