資料結構與演算法 陣列與矩陣經典題

2022-07-24 11:36:10 字數 3330 閱讀 5171

五星

leetcode:移動零

題目描述:

給定乙個陣列 nums,編寫乙個函式將所有 0 移動到陣列的末尾,同時保持非零元素的相對順序。

示例:

輸入: [0,1,0,3,12]

輸出: [1,3,12,0,0]

思想:

直接在正確的位置賦值,覆蓋掉的數不影響最終結果,最後騰出的幾位都賦值0

**:

class solution 

for(;ileetcode:重塑矩陣

題目描述:

在matlab中,有乙個非常有用的函式 reshape,它可以將乙個矩陣重塑為另乙個大小不同的新矩陣,但保留其原始資料。

給出乙個由二維陣列表示的矩陣,以及兩個正整數r和c,分別表示想要的重構的矩陣的行數和列數。

重構後的矩陣需要將原始矩陣的所有元素以相同的行遍歷順序填充。

如果具有給定引數的reshape操作是可行且合理的,則輸出新的重塑矩陣;否則,輸出原始矩陣。

示例:輸入:

nums =

[[1,2],

[3,4]]

r = 1, c = 4

輸出:

[[1,2,3,4]]

解釋:行遍歷nums的結果是 [1,2,3,4]。新的矩陣是 1 * 4 矩陣, 用之前的元素值一行一行填充新矩陣。

思想:

這題沒啥精妙的思想,就是有點複雜。

注意:index可以累加,不用每次都計算

**:
class solution 

}return ret;

}}

優先佇列,堆解法

class solution 

@override

public int compareto(item o)

}}

五星

leetcode:尋找重複數

題目描述:

給定乙個包含 n + 1 個整數的陣列 nums,其數字都在 1 到 n 之間(包括 1 和 n),可知至少存在乙個重複的整數。假設只有乙個重複的整數,找出這個重複的數。

注意:1.不能更改原陣列(假設陣列是唯讀的)。

2.只能使用額外的 o(1) 的空間。

3.時間複雜度小於 o(n2) 。

4.陣列中只有乙個重複的數字,但它可能不止重複出現一次。

示例:

輸入: [1,3,4,2,2]

輸出: 2

輸入: [3,1,3,4,2]

輸出: 3

思想:

因為重複數字可能不止出現一次,所以不能按照 錯誤的集合 這題的做法來做,即使用位運算。

該種陣列形式可以抽象成乙個帶環的鍊錶。本題可以抽象成,求環入口的問題。思想如下

**:

class solution 

slow = 0;

while(slow!=fast)

return slow;

}}

五星

leetcode:陣列相鄰差值的個數

題目描述:

給定兩個整數 n 和 k,你需要實現乙個陣列,這個陣列包含從 1 到 n 的 n 個不同整數,同時滿足以下條件:

① 如果這個陣列是 [a1, a2, a3, ... , an] ,那麼陣列 [|a1 - a2|, |a2 - a3|, |a3 - a4|, ... , |an-1 - an|] 中應該有且僅有 k 個不同整數;.

② 如果存在多種答案,你只需實現並返回其中任意一種.

示例:

輸入: n = 3, k = 2

輸出: [1, 3, 2]

解釋: [1, 3, 2] 包含 3 個範圍在 1-3 的不同整數, 並且 [2, 1] 中有且僅有 2 個不同整數: 1 和 2

思想:

前k+1個數這樣排列:1,1+k,2,k,3,k-1......可滿足條件,後面的位置按順序排

例如k為4的情況,1,5,3,2,4的差值分別是4,3,2,1滿足題設。

憑感覺這樣是對的但不知道怎麼證明。

興許可以按照以下思路來思考:

完成以上思路,需要解決乙個問題,如何保證前k+1個數排完之後,後面的數不會出現新的差值?

因為第k+2個數值為k+2,它與前乙個數的差值不可能大於k,除非前乙個數是1,但1是排在首位的,不可能有這樣的情況。

**:

class solution 且遵守以下的規則。

假設選擇索引為i的元素a[i]為s的第乙個元素,s的下乙個元素應該是a[a[i]],之後是a[a[a[i]]]... 以此類推,不斷新增直到s出現重複的元素。

示例:輸入: a = [5,4,0,3,1,6,2]

輸出: 4

解釋:

a[0] = 5, a[1] = 4, a[2] = 0, a[3] = 3, a[4] = 1, a[5] = 6, a[6] = 2.

其中一種最長的 s[k]:

s[0] = =

思想:

可以把這種結構理解成煉表,整個陣列遍歷下來一定是幾個環形鍊錶。兩層迴圈,外層遍歷每個環形鍊錶,內層遍歷環形鍊錶的每個結點。

因為多個環狀鍊錶互不相交,所以,每次訪問時,把陣列中的元素標記為-1,下次不用再訪問,可大大縮減迴圈次數。

**:

class solution 

return res;

}}

五星

leetcode:最多能完成排序的塊

題目描述:

陣列arr是[0, 1, ..., arr.length - 1]的一種排列,我們將這個陣列分割成幾個「塊」,並將這些塊分別進行排序。之後再連線起來,使得連線的結果和按公升序排序後的原陣列相同。

我們最多能將陣列分成多少塊?

示例:

輸入: arr = [4,3,2,1,0]

輸出: 1

解釋:將陣列分成2塊或者更多塊,都無法得到所需的結果。

例如,分成 [4, 3], [2, 1, 0] 的結果是 [3, 4, 0, 1, 2],這不是有序的陣列。

思想:

這題需要動筆畫一畫,仔細看看arr[i] 和 i之間的關係。

掌握以上規律之後,一趟遍歷即可得到答案。

**:

class solution 

return cnt;

}}

資料結構與演算法 陣列

陣列是一種線性表資料結構。它用一組連續的記憶體空間,來儲存一組具有相同型別的資料。其中有幾個重要的概念 非線性表 連續的記憶體空間 儲存相同型別的資料 如圖所示,這是乙個長度為5的int陣列arr,我們假設起始的記憶體位址為1000,那麼第乙個元素的記憶體位址範圍就是 1000 1003,這是因為乙...

資料結構與演算法 陣列

題型1 如何用遞迴實現陣列求和 方法1 題型2 如何用乙個for迴圈列印乙個二維陣列 方法1 array在二維陣列中的行號和列號分別為 i maxy i maxy 題型3 用遞迴和非遞迴的方法實現二分查詢 題型4 如何在排序陣列中,找出給定數字出現的次數 方法1 二分查詢,分別找出左邊界和右邊界,左...

資料結構與演算法 陣列

陣列是由相同型別的元素 element 的集合所組成的資料結構,分配一塊連續的記憶體來儲存。利用元素的索引 index 可以計算出該元素對應的儲存位址。維基百科 陣列是線性表資料結構,定義陣列時,系統會分配乙份連續的記憶體空間來儲存一組相同的型別的資料,如int num n 陣列定義為一維陣列 二維...